2016-11-07 4 views
-5
private static void v1() { //true 
    String s1 = new String("a") + new String("a"); 
    s1.intern(); 
    String s2 = "aa"; 
    System.out.println("v1: " + (s1 == s2)); 
} 

private static void v2() { //false 
    String s3 = new String("b") + new String("b"); 
    String s4 = "bb"; 
    s3.intern(); 
    System.out.println("v2: " + (s3 == s4)); 
} 

private static void v3() {// false 
    String s5 = new String("cc"); 
    s5.intern(); 
    String s6 = "cc"; 
    System.out.println("v3: " + (s5 == s6)); 
} 

private static void v4() {// false 
    String s7 = new String("dd"); 
    String s8 = "dd"; 
    s7.intern(); 
    System.out.println("v4: " + (s7 == s8)); 
} 

private static void v5() {// true 
    String s9 = new StringBuilder("e").append("e").toString(); 
    s9.intern(); 
    String s10 = "ee"; 
    System.out.println("v5: " + (s9 == s10)); 
} 

private static void v6() {// false 
    String s11 = new StringBuilder("e").append("e").toString(); 
    String s12 = "ee"; 
    s11.intern(); 
    System.out.println("v6: " + (s11 == s12)); 
} 

v1.value истинно v2.value ложно v3.value ложно v4.value ложно v5.value верно v6.value is falseПочему s1 == s2 зависит от порядка стажера()

Что случилось?
Почему s1 == s2 зависит от порядка от intern()?
«s1.intern()« изменить s1? Есть v1 == v5 и v2 == v6? Есть ли различия между jdk1.6 и 1.7? я использую 1.7.





Возможно, моя проблема не может быть точно описано? На самом деле, я получил ответ от «Понимание JVM: дополнительные функции и лучшие практики». Jdk1.6 intern, должен копировать экземпляр в постоянный пул и возвращаться к его ссылке; и 1.7 - ссылка на объект в постоянный пул. Поэтому, когда я использую s1 == s2 для сравнения ссылок, я получил правду. Этот вопрос не связан с вашим помеченным «дубликатом», потому что я забочусь о сравнении ссылок.

+8

Как минимум в основном ответы здесь: [* Как сравнить строки в Java? *] (Http://stackoverflow.com/questions/513832/how-do-compare-strings-in-java) –

+0

Вы необходимо прочитать документы для 'intern()'. Он имеет возвращаемое значение, которое вы игнорируете. – kdgregory

+0

Возможно, моя проблема не совсем точно описана? На самом деле, я получил ответ от «Знакомство с JVM: дополнительные функции и лучшие практики». Jdk1.6 intern, заключается в том, чтобы скопировать экземпляр в постоянный пул и вернуться к его ссылке; и 1.7 - ссылка на объект в постоянный пул. Поэтому, когда я использую s1 == s2 для сравнения ссылок, я получил правду. Этот вопрос не связан с вашим помеченным «дубликатом», потому что я забочусь о сравнении ссылок. –

ответ

-1

Всегда сравнивайте строки с equals, например. заменить s1 == s2 на s1.equals(s2). Первый сравнивает только ссылки из s1 и s2, а последний сравнивает их .

Что касается метода intern, читайте this на дне:

Возвращает строку, которая имеет то же содержание этой строки, но гарантированно будет из пула уникальных строк.

Следовательно, для интернирование строку, вы должны использовать s1 = s1.intern();.