2015-06-19 1 views
6

Как известно, метод String().intern() добавляет значение 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' 

str == str1 //that's returns true 

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

мне нужно знать, когда я называю test.intern(), что этот метод стажер будет делать?

добавить «собаку» с другой ссылкой в ​​пуле строк или добавить test ссылку на объект в пуле строк (я думаю, это не так)?

Я попытался это

String test1 = "dog"; 

test == test1 // returns false 

Я просто хочу, чтобы убедиться, когда я называю test.intern() он создает новый объект с тем же значением в Струнный пуле? теперь у меня есть 2 объекта со значением «собака». один существует непосредственно в куче, а другой - в String?

+0

'ул == // Обл, что возвращает true' опечатка? – jhamon

+0

жаль, что это должно быть str == str1. позвольте мне изменить свой вопрос. –

+0

Возможный дубликат [Хорошо ли использовать java.lang.String.intern()?] (Http://stackoverflow.com/questions/1091045/is-it-good-practice-to-use-java-lang -string-intern) –

ответ

11

когда я звоню test.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 
+0

Итак, теперь s2 указывает на объект в пуле, но не на объект в куче? правильно ? BTW Спасибо. Я получил свой ответ. –

+1

Да. Ты прав. 's2.intern()' будет возвращать объект из пула, поэтому перед 's2 = s2.intern()' 'переменная' s2' будет указывать на объект в куче, а затем будет указывать на объект из бассейн. – aioobe

+0

Хорошо - Спасибо. –

Смежные вопросы