2016-03-17 11 views
7

Ich habe den Code wie folgt:Warum gibt die String.intern() -Methode zwei verschiedene Ergebnisse zurück?

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); 


} 

und ich habe das Ergebnis:

true 
false 
true 

kann ich verstehen, warum line1 und line3 wahr ist, aber ich bin Ausgabe über die Linie 2, warum diese ist falsch?

Meine Java ist: java version "1.8.0_73"

+7

weil ' "java"' ist offensichtlich bereits in der konstant erhalten pool, also gibt 'str2.intern() 'nur diese Referenz zurück, die sich von der neuen Referenz' str2 'unterscheidet. – Tom

+0

@Tom Warum das "Java" schon im Konstanten Pool? und warum "String" nicht ist? – Timi

Antwort

15

String.intern() gibt einen String im Stringliteral Pool. Wenn die Zeichenfolge jedoch bereits im Pool vorhanden ist, wird die vorhandene Zeichenfolge zurückgegeben.

Wenn Sie einen neuen String holen, sollte es den String zurückgeben Sie erstellt haben, aber wenn Sie einen String verwenden, die bereits in den Pool existieren geschieht, wird die vorhandene String erhalten.

Es ist davon auszugehen, dass in diesem Fall "java" bereits im Pool vorhanden ist. Wenn Sie also intern() aufrufen, wird ein anderes Objekt zurückgegeben, sodass == falsch ist.

Anmerkung: string.intern().equals(string) sollte immer wahr sein.

+0

Aber wie beantwortet das die Frage? Ich meine, es erklärt das obige Verhalten nicht. – user2004685

+0

@ user2004685 Wie geht es nicht? – Tom

+0

@ user2004685 Für Strings '==' vergleicht die Referenz nicht den Inhalt. –

4

Die Konstante String"java" existiert bereits in der Java-Konstanten-Pool, aber Sie können das überprüfen, indem

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

zu

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

, die die gleiche Konstante erhalten wird und Ausgang

true 

Alternativ, könnten Sie "计算机软件" und "String" den konstanten Pool hinzufügen wie

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); 

Dann würden Sie (im Einklang mit Ihren Beobachtungen)

false 
false 
Verwandte Themen