与 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"
文字。
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"
文字。