String-Gleichheit vs. Standortgleichheit

7
%Vor%

// Ausgabe von
wahre
wahre
falsches
wahr

Warum haben nicht alle Zeichenketten den gleichen Platz im Speicher, wenn alle drei den gleichen Inhalt haben?

    
BloodParrot 27.02.2009, 12:46
quelle

6 Antworten

15

Java nur automatisch Praktikanten String Literale . Neue String-Objekte (die mit dem Schlüsselwort new erstellt wurden) sind standardmäßig nicht interniert. Sie können die Methode String.intern () verwenden ein vorhandenes String-Objekt internieren. Der Aufruf von intern überprüft den vorhandenen String-Pool auf ein übereinstimmendes Objekt und gibt es zurück, wenn eines vorhanden ist, oder fügt es hinzu, wenn keine Übereinstimmung gefunden wurde.

Wenn Sie die Zeile

hinzufügen %Vor%

zu Ihrem Code, direkt nachdem Sie s3 erstellt haben, sehen Sie den Unterschied in Ihrer Ausgabe.

Weitere Beispiele und eine ausführlichere Erklärung finden Sie .

Dies bringt natürlich das sehr wichtige Thema von wann zu verwenden == und wann die Methode equals in Java zu verwenden ist. Sie möchten fast immer equals verwenden, wenn Sie mit Objektreferenzen arbeiten. Der == Operator vergleicht Referenzwerte, was fast ist, was Sie nie vergleichen wollen. Wenn Sie den Unterschied kennen, können Sie entscheiden, wann Sie == oder equals verwenden möchten.

    
Bill the Lizard 27.02.2009, 12:54
quelle
3

Sie rufen explizit new für s3 auf, und Sie erhalten eine neue Instanz der Zeichenfolge.

    
sharptooth 27.02.2009 12:48
quelle
2

Das Erstellen eines String ist eigentlich ein schneller Prozess. Der Versuch, ein zuvor erstelltes String zu finden, wird viel langsamer sein.

Überlegen Sie, was Sie tun müssen, um alle String s interniert zu machen. Sie müssen eine Menge aller zuvor erstellten String s suchen. Beachten Sie, dass dies in einer Thread-sicheren Weise erfolgen muss, was zusätzlichen Aufwand verursacht. Da Sie nicht möchten, dass dieses Problem auftritt, müssen Sie eine Form von (threadsicheren) nicht starken Referenzen verwenden.

Natürlich können Sie Java nicht so implementieren, weil die Bibliothek leider Konstruktoren für String s und die meisten anderen unveränderlichen Wertobjekte verfügbar macht.

    
Tom Hawtin - tackline 27.02.2009 12:55
quelle
1

Das neue Schlüsselwort erstellt immer eine neue Zeichenfolge.

Mehr Details hier .

    
Robert Grant 27.02.2009 12:50
quelle
1
  

Warum haben nicht alle Zeichenketten denselben Platz im Speicher, wenn alle drei denselben Inhalt haben?

Weil sie verschiedene Strings mit demselben Inhalt sind!

    
Bharani 27.02.2009 12:50
quelle
1

Es gibt eine Methode namens String.intern, die im Prinzip alle Strings nimmt, die gleich sind, und sie in eine Hash-Tabelle legt (ich bin eine Art Lüge, aber dafür ist das Konzept wichtig, nicht die Realität) .

%Vor%

sollte alle "wahr" sein lassen. Dies liegt daran, dass (und ich lüge ein wenig hier, aber es ist immer noch wichtig nur für das Konzept und nicht die Realität) String s1="BloodParrot ist der Mann"; ist so etwas wie String s1="BloodParrot ist der Mann" .intern ();

gemacht     
TofuBeer 27.02.2009 15:14
quelle

Tags und Links