Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不应该';t I do`String s=新字符串(“新字符串”);`在Java中,即使使用自动字符串插入?_Java_String_Object_String Interning - Fatal编程技术网

不应该';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
和上述问题的答案,我们应该do
String 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(“一个新字符串”)
比“一个新字符串”
好?我不明白你为什么要用前者。