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