Java中使用Intern方法的差异

Java中使用Intern方法的差异,java,Java,这个问题可能很简单,只是为了100%确定我在问这个问题。。这两种情况有什么区别 案例1: 案例2: String s = "Hello"; String s1 = new String("Hello").intern(); System.out.println(s == s1); 现在案例1显示为假,案例2显示为真 有人能解释一下原因吗?在第一个示例中,您忽略了s2.intern()的返回值,它返回对池中字符串的引用(即s) 因此,s2仍然引用原始的非池化字符串。String是不可变的,因此在

这个问题可能很简单,只是为了100%确定我在问这个问题。。这两种情况有什么区别 案例1:

案例2:

String s = "Hello";
String s1 = new String("Hello").intern();
System.out.println(s == s1);
现在案例1显示为假,案例2显示为真


有人能解释一下原因吗?

在第一个示例中,您忽略了
s2.intern()
的返回值,它返回对池中字符串的引用(即
s


因此,
s2
仍然引用原始的非池化字符串。

String
是不可变的,因此在您编写的第一个示例中:

String s2 = new String("Hello");
s2.intern();
s2
不会更改。所以这里:

System.out.println(s == s2);
您仍然可以将
新字符串(“Hello”)
“Hello”
进行比较,因为这两个字符串中的一个是使用
新的
操作符创建的,因此它们并不引用同一个对象


在第二个示例中,您将池值(使用
intern()
)分配给
变量

String s = "Hello";
String s1 = new String("Hello").intern();
因此,这里:

System.out.println(s == s2);
System.out.println(s == s1);

s
s1
引用同一个对象。

调用intern方法时,请阅读intern的Javadoc:
,如果池中已经包含一个等于equals(object)方法确定的该字符串对象的字符串,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用。
谢谢。。我理解字符串池和堆之间的区别,但忽略Kayaman提到的intern()的返回类型,我看不到这一点