2016-03-17 3 views
7

У меня есть такой код:Почему метод String.intern() возвращает два разных результата?

public static void main(String[] args) { 
    String str1 = new StringBuilder("计算机").append("软件").toString(); 
    System.out.println(str1.intern()==str1); 

    String str2 = new StringBuilder("ja").append("va").toString(); 
    System.out.println(str2.intern()==str2); 

    String str3 = new StringBuilder("Str").append("ing").toString(); 
    System.out.println(str3.intern()==str3); 


} 

и у меня есть результат:

true 
false 
true 

Я могу понять, почему line1 и line3 верно, но я вопрос о line2, почему этот ложно?

Мой Java является: Java версии "1.8.0_73"

+7

, потому что '«ява»', очевидно, уже в постоянной пул, поэтому 'str2.intern()' просто возвращает эту ссылку, которая отличается от новой ссылки 'str2'. – Tom

+0

@Tom Почему «java» уже находится в постоянном пуле? и почему «String» нет? – Timi

ответ

15

String.intern() возвращает строку в строковой литерал бассейн. Однако, если строка уже существует в пуле, она вернет существующую строку.

Если вы выберете новую строку, она должна вернуть созданный вами String, но если вы используете String, который существует в пуле, вы уже получите существующую строку.

Разумно предположить, что в этом случае в пуле уже существует "java", поэтому при вызове intern() он возвращает другой объект, поэтому == является ложным.

примечание: string.intern().equals(string) всегда должно быть правдой.

+0

Но как это отвечает на вопрос? Я имею в виду, что это не объясняет вышеуказанное поведение. – user2004685

+0

@ user2004685 Как это не так? – Tom

+0

@ user2004685 Для строк '==' сравнивает ссылку, а не содержимое. –

4

Константа String"java" уже существует в постоянном Java бассейн, но вы можете проверить, что за счет изменения

String str2 = new StringBuilder("ja").append("va").toString(); 
System.out.println(str2.intern()==str2); 

в

String str2 = new StringBuilder("ja").append("va").toString(); 
System.out.println(str2.intern() == "java"); 

который получит ту же константу и выход

true 

В качестве альтернативы можно добавить "计算机软件" и "String" в постоянном бассейне как

String a = "计算机软件"; 
String b = "String"; 
String str1 = new StringBuilder("计算机").append("软件").toString(); 
System.out.println(str1.intern() == str1); 

String str3 = new StringBuilder("Str").append("ing").toString(); 
System.out.println(str3.intern() == str3); 

Тогда вы получите (в соответствии с вашими наблюдениями)

false 
false