Heim > Java > javaLernprogramm > Warum gibt der „=='-Vergleich der endgültigen Zeichenfolgen in Java manchmal „True' und manchmal „False' zurück?

Warum gibt der „=='-Vergleich der endgültigen Zeichenfolgen in Java manchmal „True' und manchmal „False' zurück?

Susan Sarandon
Freigeben: 2024-11-30 16:42:14
Original
264 Leute haben es durchsucht

Why Does `==` Comparison of Final Strings in Java Sometimes Return True and Sometimes False?

Vergleich finaler Strings mit == in Java

Strings in Java sind unveränderlich und verhalten sich eindeutig, wenn sie als final deklariert werden. Betrachten Sie den folgenden Code:

String str1 = "str";
String str2 = "ing";
String concat = str1 + str2;

System.out.println(concat == "string"); // false
Nach dem Login kopieren

Hier gibt der Vergleich „false“ zurück, da „==" Objektreferenzen vergleicht. Wenn wir jedoch die Zeichenfolgen als endgültig deklarieren:

final String str1 = "str";
final String str2 = "ing";
String concat = str1 + str2;

System.out.println(concat == "string"); // true
Nach dem Login kopieren

Jetzt gibt der Vergleich aus unerklärlichen Gründen „true“ zurück.

Grund

Endgültige Zeichenfolgen, die initialisiert werden Mit konstanten Ausdrücken zur Kompilierungszeit, wie im Beispiel oben, werden sie zu konstanten Variablen und erhalten eine einzigartige Eigenschaft: Sie sind intern. Internierung bedeutet, dass eindeutige Instanzen von Zeichenfolgen gemeinsam genutzt werden.

Im zweiten Codeausschnitt wird das Verkettungsergebnis „string“ zur Kompilierungszeit interniert. Somit hat es dieselbe Referenz wie das String-Literal „string“, das an „==“ übergeben wird. Daraus ergibt sich der wahre Vergleich.

Bytecode-Analyse

Der Unterschied zwischen den beiden Versionen ist in ihrem Bytecode zu sehen:

  • Nein -endgültige Version: Erstellt StringBuilder und verkettet Strings zur Laufzeit, wodurch ein neues String-Objekt erstellt wird.
  • Endgültige Version: Integriert die verkettete Zeichenfolge „string“ zur Kompilierungszeit und verwendet direkt referenzierte interne Instanzen.

Fazit

Endgültige Zeichenfolgen mit konstanten Ausdrücken zur Kompilierungszeit in Java sind internieren und einzigartige Instanzen teilen. Dies kann beim Vergleich mit „==“ zu unerwarteten Ergebnissen führen, da Objektverweise direkt und nicht deren Werte überprüft werden.

Das obige ist der detaillierte Inhalt vonWarum gibt der „=='-Vergleich der endgültigen Zeichenfolgen in Java manchmal „True' und manchmal „False' zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage