6

好的,这个问题是这个问题的延伸

Java 字符串:"String s = new String("silly");"

上面的问题和这个问题问的一样,但我有一个新的怀疑点。

根据Effective Java上述问题的答案,我们不应该这样String s = new String("a new string");,因为那会创建不必要的对象。

我不确定这个结论,因为我认为 Java 正在做自动字符串实习,这意味着对于一个字符串,无论如何内存中只有一个副本。

那么让我们看看String s = new String("a new string");

"a new string"已经是在内存中创建的字符串。

当我这样做时String s = new String("a new string");,那s是也"a new string"。所以根据automatic string interning,s应该是指向 的同一个内存地址"a new string"吧?

那么我们怎么能说我们创造了不必要的对象呢?

4

3 回答 3

16

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
于 2012-05-19T15:38:34.187 回答
2

您可能想阅读更多关于JVM 中的字符串文字池的信息。快速谷歌搜索将我指向这篇文章: http ://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 这似乎很有效。

此外,您可能对整数文字池以及 Java 中的其他文字池感兴趣。

于 2012-05-19T15:44:04.463 回答
0

使用 "=" 而不是 "=new String" 更好,因为它可能会导致单个实例而不是多个实例。

于 2012-05-19T15:42:14.067 回答