String.intern()是如何工作的?它如何影响字符串池?

6

我们知道,String().intern()方法会将字符串值添加到字符串池中,如果该值尚不存在。如果已存在,则返回该值/对象的引用。

String str = "Cat"; // creates new object in string pool  with same character sequence.  
String st1 = "Cat"; // has same reference of object in pool, just created in case of 'str'

 str == str1 //that's returns true

String test = new String("dog");
test.intern();// what this line of code do behind the scene

当我调用test.intern()时,这个intern方法会做什么呢?

是将"dog"添加到字符串池中的不同引用,还是将test对象的引用添加到字符串池中(我认为后者不是这种情况)?

我尝试了一下:

String test1 = "dog";

test == test1 // returns false

我只想确认一下,当我调用test.intern()时,它会在字符串池中创建一个具有相同值的新对象吗?现在我有两个值为"dog"的对象,一个存在于堆中,另一个存在于字符串池中?


str == str //that's returns true 打字错误? - jhamon
抱歉,应该是 str == str1。让我编辑我的问题。 - Muneeb Nasir
可能是使用java.lang.String.intern()的好习惯吗?的重复问题。 - Rahul Tripathi
3
你读过 Javadoc 吗? - Tom
@RahulTripathi 我问的是另外一件事情。请再读一遍。 - Muneeb Nasir
显示剩余2条评论
1个回答

11

当我调用test.intern()时,intern方法会做什么?

它将把字符串"dog"放入字符串池中(除非它已经存在)。但它不一定会将test引用的对象放入池中。这就是为什么通常执行以下操作的原因。

test = test.intern();

请注意,如果您在代码中有一个"dog"文字,那么字符串池中已经有一个"dog",因此test.intern()将返回该对象。

也许你的实验让你感到困惑,而实际上是你考虑的以下实验:

String s1 = "dog";             // "dog" object from string pool
String s2 = new String("dog"); // new "dog" object on heap

System.out.println(s1 == s2);  // false

s2 = s2.intern();              // intern() returns the object from string pool

System.out.println(s1 == s2);  // true

那么,现在s2指向池中存在的一个对象,但不指向堆中的对象?对吧?顺便说一句,谢谢。我得到了我的答案。 - Muneeb Nasir
1
是的。你说得对。s2.intern()会从池中返回一个对象,所以在s2 = s2.intern()之前,s2变量将指向堆上的一个对象,之后它将指向池中的一个对象。 - aioobe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接