Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java String.intern()如何工作以及它如何影响字符串池?_Java_String - Fatal编程技术网

Java String.intern()如何工作以及它如何影响字符串池?

Java String.intern()如何工作以及它如何影响字符串池?,java,string,Java,String,正如我们所知,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' st

正如我们所知,
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”的对象。一个直接存在于堆中,另一个存在于字符串池中

当我调用
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

str==str//返回true
typo?对不起,应该是str==str1。让我编辑我的问题。可能的重复项您阅读过Javadoc吗?您应该使用
.equals()
方法来比较字符串,而不是
=
,因此,现在s2指向池中存在的对象,而不是堆中的对象?正确的?顺便说一句,谢谢。我得到了答案,是的。你说得对
s2.intern()
将从池中返回一个对象,因此在
s2=s2.intern()
之前,
s2
变量将指向堆中的一个对象,之后它将指向池中的一个对象。