【发布时间】:2012-05-26 20:22:27
【问题描述】:
好的,这个问题是这个问题的延伸
Java Strings: "String s = new String("silly");"
上面的问题和这个问题问的一样,但是我有一个新的疑问。
根据Effective Java和上述问题的答案,我们应该不做String s = new String("a new string");,因为那会创建不必要的对象。
我不确定这个结论,因为我认为Java是在做automatic string interning,这意味着对于一个字符串,反正内存中只有一个副本。
让我们看看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"的同一个内存地址吧?
那我们怎么能说我们创造了不必要的对象呢?
【问题讨论】:
-
只有是字符串的一个副本除非你这样做
new String(...)。除非必须,否则不要这样做。 -
+1 有趣的问题,从来没想过。但是,大多数情况下,您可以通过查看两个版本之间字节码的差异(或缺乏差异)来检查这些内容。
-
interning 仅在String文字上自动执行。 -
因为还有一个字符串,所以
new就是这么做的。 -
是什么让您认为
new String("a new string")比"a new string"更好?我不明白你为什么要使用前者。
标签: java string object string-interning