与 concat 一起使用时,字符串池的行为会有所不同吗?

String Pool behaves differently when used with concat?

String s1 = "Hello".concat("World");
String s3 = new String("HelloWorld"); //Line-2
String s2 = s1.intern();
System.out.println(s1 == s2); //false
System.out.println(s1 == s3); //false
System.out.println(s2 == s3); //false

如果我删除第 2 行并比较 s1==s2,它将 return 为真。谁能解释一下第 2 行之后字符串池中到底发生了什么?堆和常量池中的每一行发生了什么?

据我了解,s1 将在常量池中创建 "HelloWorld"。 但是 s1 == s2 仍然是假的?

当你有这个:

String s1 = "Hello".concat("World");
String s2 = s1.intern();
System.out.println(s1 == s2); //true

...s1.intern()s1 添加到池中,并将 return 添加到 s1,因为池中已经没有等效字符串。所以自然s1 == s2是真的。

但是当你有这个时:

String s1 = "Hello".concat("World");
String s3 = new String("HelloWorld"); //Line-2
String s2 = s1.intern();
System.out.println(s1 == s2); //false
System.out.println(s1 == s3); //false
System.out.println(s2 == s3); //false

...在该代码运行之前已经池中有一个"HelloWorld"字符串(因为字符串文字在class加载期间被放入池中).所以调用 s1.intern() returns 来自池的字符串,而不是 s1。所以 s1 == s2 是假的。

如果我们这样做会更明显:

String s1 = "Hello".concat("World");
String sx = "HelloWorld";
String s3 = new String(sx);
String s2 = s1.intern();
System.out.println(s1 == s2); //false
System.out.println(s1 == s3); //false
System.out.println(s2 == s3); //false
System.out.println(s1 == sx); //false
System.out.println(s2 == sx); //true

sx是代码开始前池中的那个运行.

From what i understand s1 will create "HelloWorld" in constant pool

不,concat 不会将其 return 字符串放入池中。 s1 仅在您调用 s1.intern() 稍后 放入池中,并且仅当池中尚无等效字符串时。当代码中没有 "Line-2" 时没有,但是当代码中有 "Line-2" 时:该行上的 "HelloWorld" 文字。