Java字符串实习生和文字

foo*_*foo 12 java string literals

以下两段代码是否相同?

String foo = "foo";
String foo = new String("foo").intern();
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 15

它们具有相同的最终结果,但它们不相同(它们将产生不同的字节码; new String("foo").intern()版本实际上经过这些步骤,产生一个新的字符串对象,然后实习它).

两个相关的引用来自String#intern:

intern被调用的方法,如果池已经包含一个字符串等于该String由测定对象equals(Object)的方法,然后从池中字符串被返回.否则,将此String对象添加到池中,并String返回对此对象的引用.

所有文字字符串和字符串值常量表达式都是实体.

所以最终结果是相同的:引用实习字符串"foo"的变量.

  • @foo:它可能是,但它可以立即再次由GC进行回收,因为在表达式结尾处没有对它的未完成引用.我希望优化的JVM(如Sun/Oracle的HotSpot)在第一次传递时优化`new String("foo").intern()`,一旦注意到调用构造函数没有副作用.或者它可能不是因为除非这是一个紧密的循环,它不符合值得的门槛. (3认同)