不应该';t I do`String s=新字符串(“新字符串”);`在Java中,即使使用自动字符串插入?
好的,这个问题是这个问题的延伸 上面的问题和这个问题问的是同一个问题,但我有一个新的怀疑点 根据不应该';t I do`String s=新字符串(“新字符串”);`在Java中,即使使用自动字符串插入?,java,string,object,string-interning,Java,String,Object,String Interning,好的,这个问题是这个问题的延伸 上面的问题和这个问题问的是同一个问题,但我有一个新的怀疑点 根据effectivejava和上述问题的答案,我们应该不doString s=newstring(“一个新字符串”),因为这将创建不必要的对象 我不确定这个结论,因为我认为Java正在做,这意味着对于一个字符串,不管怎样,内存中只有它的一个副本 让我们看看String s=newstring(“新字符串”) “新字符串”已经是在内存中创建的字符串 当我做String时,s=新字符串(“新字符串”),则
effectivejava
和上述问题的答案,我们应该不doString s=newstring(“一个新字符串”)代码>,因为这将创建不必要的对象
我不确定这个结论,因为我认为Java正在做,这意味着对于一个字符串,不管怎样,内存中只有它的一个副本
让我们看看String s=newstring(“新字符串”)代码>
“新字符串”
已经是在内存中创建的字符串
当我做String时,s=新字符串(“新字符串”)
,则s
也是“新字符串”
。因此根据自动字符串插入
,s
应该指向与“新字符串”
相同的内存地址,对吗
那么我们怎么能说我们创建了不必要的对象呢?使用“=”而不是“=新字符串”更好,因为它可能会导致一个实例而不是多个实例。您可能需要阅读更多关于JVM中字符串文字池的信息。快速谷歌搜索将我引向这篇文章:
String a = "foo"; // this string will be interned
String b = "foo"; // interned to the same string as a
boolean c = a == b; //this will be true
String d = new String(a); // this creates a new non-interned String
boolean e = a == d; // this will be false
String f = "f";
String g = "oo";
String h = f + g; //this creates a new non-interned string
boolean i = h == a // this will be false
File fi = ...;
BufferedReader br = ...;
String j = br.readLine();
boolean k = a == j; // this will always be false. Data that you've read it is not automatically interned
这似乎很有道理
此外,您可能对整型文字池以及Java中的其他文字池感兴趣。只有一个字符串副本,除非您执行新建字符串(…)
。除非你必须这样做,否则不要这样做。+1对于有趣的问题,不要去想它。但是,大多数情况下,你可以通过查看两个版本之间字节码的差异(或没有差异)来检查这些内容。intern
ing只会自动对String
literals执行。因为还有另一个字符串,这就是new
所做的。你为什么认为new String(“一个新字符串”)
比“一个新字符串”
好?我不明白你为什么要用前者。