Java中使用Intern方法的差异
这个问题可能很简单,只是为了100%确定我在问这个问题。。这两种情况有什么区别 案例1: 案例2: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是不可变的,因此在
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()的返回类型,我看不到这一点