// Ausgabe von
wahre
wahre
falsches
wahr
Warum haben nicht alle Zeichenketten den gleichen Platz im Speicher, wenn alle drei den gleichen Inhalt haben?
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.
Sie rufen explizit new für s3 auf, und Sie erhalten eine neue Instanz der Zeichenfolge.
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.
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