Java 字符串实习生函数结果问题
Java String intern function result problem
我正在学习Java,我看了这个问题:What is Java String interning? - Stack Overflow
但我阅读了其他文章,其中提供了一些我不理解的示例:
public static void main(String[] args) {
String str2 = new String("str") + new String("01");
str2.intern();
String str1 = "str01";
System.out.println(str2 == str1); //true
String s4 = new String("1");
s4.intern();
String s5 = "1";
System.out.println(s4 == s5); //false
String s = new StringBuilder("aa").append("bb").toString();
String s2 = new StringBuilder("cc").toString();
System.out.println(s.intern() == s); //true
System.out.println(s2.intern() == s2); //false
}
Java 11 中的结果(在 Java 8 中应该相同)是:
true
false
true
false
我不知道为什么结果不同,我想这都是真的。
谁能解释一下?
让我们看看 intern
实际做了什么(强调我的):
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
当此代码为运行时:
str2.intern();
字符串池仅包含"str"
和"01"
。 str2
是"str01"
,不在字符串池中,所以把str2
引用的对象也加入到字符串池中。因此,当到达下一行时,由于 "str01"
已经在池中,因此 str1
将引用与 str2
.
相同的对象
请注意,str2 == str1
之所以 而不是 ,是因为 intern
以某种方式改变了 str2
所指的对象。它不会对str2
做任何事情。毕竟字符串是不可变的。
现在我们可以理解第一个false
了。在行中:
String s4 = new String("1");
由于字符串文字 "1"
,"1"
被添加到字符串池中。请注意,添加到字符串池中的对象与 s4
引用的对象不同。现在您调用 s4.intern()
,它对 s4
没有任何作用,并且 return 是字符串池 中的对象。但是您忽略了 return 值。这就是 s4 != s5
和 s4.intern() == s5
.
的原因
s2.intern() != s2
的原因要简单得多—— s2
与字符串池中的 "cc"
指的是不同的对象! s2.intern()
应该是return字符串池中的对象,当然不是同一个对象!
我正在学习Java,我看了这个问题:What is Java String interning? - Stack Overflow
但我阅读了其他文章,其中提供了一些我不理解的示例:
public static void main(String[] args) {
String str2 = new String("str") + new String("01");
str2.intern();
String str1 = "str01";
System.out.println(str2 == str1); //true
String s4 = new String("1");
s4.intern();
String s5 = "1";
System.out.println(s4 == s5); //false
String s = new StringBuilder("aa").append("bb").toString();
String s2 = new StringBuilder("cc").toString();
System.out.println(s.intern() == s); //true
System.out.println(s2.intern() == s2); //false
}
Java 11 中的结果(在 Java 8 中应该相同)是:
true
false
true
false
我不知道为什么结果不同,我想这都是真的。 谁能解释一下?
让我们看看 intern
实际做了什么(强调我的):
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
当此代码为运行时:
str2.intern();
字符串池仅包含"str"
和"01"
。 str2
是"str01"
,不在字符串池中,所以把str2
引用的对象也加入到字符串池中。因此,当到达下一行时,由于 "str01"
已经在池中,因此 str1
将引用与 str2
.
请注意,str2 == str1
之所以 而不是 ,是因为 intern
以某种方式改变了 str2
所指的对象。它不会对str2
做任何事情。毕竟字符串是不可变的。
现在我们可以理解第一个false
了。在行中:
String s4 = new String("1");
由于字符串文字 "1"
,"1"
被添加到字符串池中。请注意,添加到字符串池中的对象与 s4
引用的对象不同。现在您调用 s4.intern()
,它对 s4
没有任何作用,并且 return 是字符串池 中的对象。但是您忽略了 return 值。这就是 s4 != s5
和 s4.intern() == s5
.
s2.intern() != s2
的原因要简单得多—— s2
与字符串池中的 "cc"
指的是不同的对象! s2.intern()
应该是return字符串池中的对象,当然不是同一个对象!