Heim >Java >javaLernprogramm >Wie wirkt sich das Schlüsselwort „final' auf String-Vergleiche in Java aus?
String-Vergleich und Finalität in Java
In Java spielen Strings eine zentrale Rolle und ihr Verhalten kann durch das finale Schlüsselwort beeinflusst werden. Betrachten Sie den folgenden Codeausschnitt:
String str1 = "str"; String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string");
Dieser Code verkettet zwei Zeichenfolgen und vergleicht sie dann mit der Literalzeichenfolge string unter Verwendung des Gleichheitsoperators ==. Das Ergebnis ist erwartungsgemäß falsch.
Wenn die String-Variablen jedoch als endgültig deklariert werden, ändert sich das Ergebnis:
final String str1 = "str"; final String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string");
In diesem Fall gibt der Vergleichsausdruck jetzt „true“ zurück. Diese Verhaltensänderung wirft die Frage auf, wie sich Final auf String-Vergleiche auswirkt.
Das Zusammenspiel von Finalität und Internierung
Wenn in Java ein String mit einer Kompilierung erstellt wird, Wird ein Zeitkonstantenausdruck (z. B. eine Literalzeichenfolge) verwendet und die Zeichenfolgenvariable als endgültig markiert, wird sie zu einer konstanten Variablen. Solche konstanten Variablen werden vom Compiler inline eingefügt, was bedeutet, dass ihr Wert an der Stelle ersetzt wird, an der sie verwendet werden.
In unserem zweiten Codebeispiel sieht die Verkettungsoperation effektiv wie folgt aus:
String concat = "str" + "ing"; // Inlined from final variables
Dies ergibt sich in:
String concat = "string";
Der String string ist intern, d. h. er wird in einem Pool eindeutiger String-Instanzen gespeichert. Dieselbe interne Instanz wird für jedes andere String-Literal mit identischem Inhalt verwendet.
Wenn wir concat mit „string“ vergleichen, vergleichen wir tatsächlich zwei Referenzen auf dieselbe interne Instanz. Daher ist das Ergebnis wahr.
Der nicht-endgültige Fall
Da die Zeichenfolgenvariablen im ersten Codebeispiel nicht endgültig sind, sind sie nicht zur Kompilierungszeit gültig Konstante Ausdrücke. Der Verkettungsvorgang erfolgt zur Laufzeit, wodurch ein neues String-Objekt erstellt wird. Dieses Objekt ist nicht intern, daher unterscheidet sich seine Referenz von der internen Referenz von „string“, was zu einem falschen Vergleich führt.
Schlussfolgerung
In Java wird ein String deklariert Variablen als final und deren Initialisierung mit konstanten Ausdrücken zur Kompilierungszeit können Auswirkungen auf Zeichenfolgenvergleiche haben. Wenn die Zeichenfolge interniert ist, wie es bei endgültigen Variablen der Fall ist, werden Vergleiche auf der Grundlage gemeinsamer Verweise auf die eindeutige internierte Instanz durchgeführt, was zu möglicherweise unterschiedlichen Ergebnissen führt.
Das obige ist der detaillierte Inhalt vonWie wirkt sich das Schlüsselwort „final' auf String-Vergleiche in Java aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!