2015-10-28 2 views
5
String a = "abc"; 
String b = a.substring(1); 
b.intern(); 
String c = "bc"; 
System.out.println(b == c); 

Вопрос может быть глупым, поскольку у старейшины нет значительного использования здесь, все же я смущен фактом, почему b == c результаты true.Как работает стажер в следующем коде?

Когда

String b = a.substring(1) 

выполняется, Струнные b ссылок на объект, имеющий "bc"

ли b.intern создать буквальный "bc" в строковой константе бассейна, даже если это произойдет, как же b==c результата в true?

+1

Посмотрите на документацию для [intern] (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#intern) –

ответ

5

String b = a.substring(1); возвращает строку экземпляра, который содержит "bc", но этот экземпляр не является частью строки пула (только литералы по умолчанию интернированных, строка создается с помощью new String(data) и вернулся из методов, как substring или nextLine не интернированы по умолчанию).

Теперь, когда вы вызываете

проверки
b.intern(); 

этот метод, если строка содержит строку Pool, равную единице, хранящегося в b (который является «БК»), а если нет, то он помещает эту строку там. Таким образом, синуса нет строки, представляющей "bc" в пуле, там будет размещена строка от b.

Итак, теперь String pool содержит "abc" и "bc".

Из-за того, что при вызове

String c = "bc"; 

строковый литерал, представляющий bc (который так же, как и в b ссылки) будут повторно использоваться из пула, что означает, что b и c проведет же экземпляр.

Это подтверждает результат b==c, который возвращает true.

+0

Может ли нижестоящий объяснить, что я пропустил? – Pshemo

+0

Но String b указывает на объект, содержащий «bc», b.intern(); просто помещает «bc» в пул String, и когда мы выполняем String c = «bc», он извлекает ссылку из пула строк, а String b указывает на объект, содержащий «bc». Как b и c содержат одну и ту же ссылку. Пожалуйста, дайте мне знать, где я ошибаюсь. –

+0

Я не являюсь избирателем, но это * «Так что синуса нет строки, представляющей« bc »в пуле» * звучит неправильно, потому что '' bc'' уже находится в пуле, потому что что буквальный (из 'String c =" bc "') будет интернирован во время загрузки класса. – Tom

5

Посмотрите на документ из String#intern() метода

Когда стажер метод вызываются, если пул уже содержит строку, равную этот объект Строки, как определено равенство метод (Object), то строку из пул возвращается. В противном случае этот объект String добавляется в пул и возвращается ссылка на этот объект String.

Теперь следить за комментариями

String b = a.substring(1); // results "bc" 
    b.intern();     // check and places "bc" in pool 
    String c = "bc";   // since it is a literal already presented in pool it gets the reference of it 
    System.out.println(b == c);// now b and c are pointing to same literal 
+0

Downvoter, помогите объяснить в чем причина? –

+0

Спасибо за быстрый ответ, но не String b все еще указывает на объект в памяти с bc? b.intern возвращает ссылку из пула строк, но мы не сохраняем ссылку где-нибудь –

+0

Вызов 'b.intern() 'ничего не делает для' b', но он помещает копию строки, на которую он ссылается, в пул строк. Результатом запуска этого кода будет 'false'. Код должен иметь 'b = b.intern();'. – EJP