2016-04-20 4 views
4

Hier ist mein Code und ich bin jetzt ziemlich verwirrt über String-Pool und Heap-Speicher von diesem Ausgang.String Concat mit derselben Referenz?

public class String1 { 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     String str = "abcd"; 
     String str1 = "" ; 

     str1=str1+"abcd"; 

     if(str.equals(str1)) 
      System.out.println("True"); 
     else 
      System.out.println("False"); 

     if(str == str1) 
      System.out.println("True"); 
     else 
      System.out.println("False"); 
    } 
} 

Nun, ich bin die Schaffung String str und wird in String-Pool gespeichert werden (korrigiert mich wenn ich falsch bin immer!). Jetzt nach concat str1 mit Zeichenfolge "abcd" haben beide den gleichen Wert. Also, ich denke, str und str1 sollte die gleiche Referenz in String-Pool und So, 2. if Anweisung sollte true drucken, aber es druckt false.

Also, meine Frage, warum str und str1 nicht die gleiche Referenz bekommen?

+0

Schauen Sie hier: http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java und http://stackoverflow.com/questions/19965895/passing-value-of- A-String-in-einem-Array-zu-einem-Methode-in-Java/19966154 # 19966154 – dimas

+0

verwirrt !!! wie diese einfach doppelte Frage bekam 5 ** UPVOTE **! – muzahidbechara

Antwort

4

Java automatisch Praktikanten (Mittel, legt sie in den String-Pool) String Literale, nicht neu erstellten Strings. Siehe auch https://stackoverflow.com/a/1855183/1611055.

Denken Sie daran, dass Strings unveränderlich sind, daher muss der Operator + einen neuen String erstellen - er kann nicht an den vorhandenen angehängt werden. Intern verwendet der Operator + einen StringBuilder, um die Zeichenfolgen zu verketten. Das Endergebnis wird durch StringBuilder.toString() abgerufen, was im Wesentlichen return new String(value, 0, count); ist.

Dieser neu erstellte String wird nicht automatisch in den String-Pool eingefügt.

Daher unterscheidet sich die str1 Referenz von str, obwohl die Strings den gleichen Inhalt haben. str zeigt auf eine Position im String-Pool, während str1 auf einen Speicherort auf dem Heap zeigt.

Wenn Sie hinzufügen

str1 = str1.intern(); 

nach str1 = str1 + "abcd"; explizit intern den neu erstellten String, Ihre zweite if Anweisung gibt true.

Alternativ hätte str1 = (str1 + "abcd").intern(); den gleichen Effekt.

+0

Sie sind richtig für Intern wird String-Objekt von Heap zu Pool übertragen. Aber ich bleibe immer noch bei meiner Frage, warum str und str1 nicht die gleiche Referenz bekommen? – Darshit

+1

@Darshit Weil das Objekt, auf das 'str' verweist, im Pool gespeichert wird, während das Objekt, auf das' str1' verweist, auf dem Heap gespeichert wird. –

+1

Ich sah interne Implementierung der Concat-Methode und es gibt neue Instanz von String zurück. Vielen Dank !!! – Darshit

-2

Sie haben Recht, dass die Strings zum String-Pool hinzugefügt werden. aber == prüft, ob beide Objekte auf den gleichen Verweis verweisen (um es einfacher zu machen, auf den gleichen Speicherort zu zeigen) im Zeichenfolgenpool oder nicht. während. equals() - Methode überprüft, ob der Wert der beiden Objekte identisch sind oder nicht.

+0

Keine Zeichenfolgen werden nicht automatisch zum Zeichenfolgenpool hinzugefügt. Nur String-Konstanten und Strings explizit 'intern()' -ed gehen dorthin. –

-1

Im Falle von Strings zum Vergleichen der Werte sollten wir die equals-Methode verwenden, da sie Werte vergleicht, die in den String-Variablen vorhanden sind.

Aber wenn wir String-Variablen mit == vergleichen, vergleicht es die Adressen des String-Objekts nicht die Werte, so dass es falsch zurückgibt, auch wenn sie dieselben Werte haben.