正如这些Stackoverflow问题所解释的那样:问题1和问题2,我理解当“字符串字面量”时会被interned:
String s = "abc";
当JVM需要创建一个新的字符串对象而不是使用String Pool中已有的字符串对象时:
String s = new String("abc");
然而,在阅读以下两个类似的语句后,我有一个疑问。
来自SCJP preparation book:
当编译器遇到字符串文字时,它会检查池中是否已经存在相同的字符串。如果找到匹配项,则将对新文字的引用定向到现有字符串,并且不会创建新的字符串文字对象。
来自JavaRanch: 在这种情况下,由于关键字“new”的存在,我们实际上会得到略微不同的行为。在这种情况下,对字符串文字的引用仍然被放入常量表(字符串文字池)中,但是,当您使用关键字“new”时,JVM有义务在运行时创建一个新的字符串对象,而不是使用常量表中的对象。
如果我们在使用“new”创建对象时,在非池内存和池内存中都放置了一个引用,根据上述定义,JVM难道不应该在执行此操作时返回相同的引用吗?
String one = new String("test");
String two = "test";
System.out.println(one.equals(two)); // true
System.out.println(one == two); // false
因为在声明字符串字面值
String three = "test";
时,它已经存在于池中,所以应该返回相同的引用并打印true吗?还是前面的语句意味着它们将被放入池内存,但在使用new
运算符时会被跳过?
System.out.println(one.intern() == two);
将返回true。 - Jeshurun