Heim >Java >javaLernprogramm >Java-Ganzzahlvergleich: Wann sollte ich „==' vs. „equals()' verwenden?

Java-Ganzzahlvergleich: Wann sollte ich „==' vs. „equals()' verwenden?

Barbara Streisand
Barbara StreisandOriginal
2024-12-26 18:03:11463Durchsuche

Java Integer Comparison: When Should I Use `==` vs. `equals()`?

Ganzzahlvergleichsrätsel in Java: == vs. equal()

In Java 1.5 und höher können Ganzzahlen als primitive int behandelt werden Werte in vielen Szenarien. Ein aktuelles Codeproblem hat jedoch Fragen zur Gültigkeit der Verwendung des ==-Operators für Ganzzahlvergleiche aufgeworfen.

Problemstellung

Beachten Sie den folgenden Codeausschnitt:

Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
    mismatch = true;

Dieser Code scheint die Nichtübereinstimmung auf „true“ zu setzen, wenn die Werte von cdiCt und cdsCt gleich sind. Das Problem wird deutlich, wenn man den booleschen Ausdruck untersucht: Er wird als „falsch“ ausgewertet, wenn die Werte tatsächlich gleich sind, aber irgendwie wird „Mismatch“ immer noch auf „true“ gesetzt, wenn die Ausführung fortgesetzt wird.

Auflösung

Die Lösung für dieses Problem ist die Verwendung der Methode equal() stattdessen:

if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))

Erklärung

Der Operator == vergleicht die Speicherreferenzen zweier Objekte, während die Methode equal() deren Werte vergleicht. Bei primitiven Typen wie int funktioniert der ==-Operator wie erwartet. Bei Objekten wie Integer prüft der ==-Operator jedoch nur, ob die Referenzen auf denselben zwischengespeicherten Wert verweisen.

Aus Leistungsgründen speichert die JVM Integer-Werte zwischen -128 und 127. Daher gibt der Operator beim Vergleich zweier Ganzzahlen mit == nur dann „true“ zurück, wenn beide Werte in diesen Bereich fallen. Im gegebenen Szenario liegen die Werte wahrscheinlich knapp außerhalb dieses Bereichs, was zu unerwartetem Verhalten führt.

Schlussfolgerung

Obwohl die Verwendung von == zum Vergleichen von Grundelementen akzeptabel ist, ist dies der Fall Es wird empfohlen, die Methode equal() zum Vergleichen umschlossener Objekte wie Integer zu verwenden. Dies stellt ein konsistentes Verhalten unabhängig von den beteiligten Werten sicher.

Zusätzliche Ressourcen

  • [Unveränderliche Objekte / Wrapper-Klasse Caching](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Integer.html#Immutable_Objects_.2F_Wrapper_Class_Caching)
  • [Warum kann Der Compiler/JVM macht Autoboxing einfach „einfach“. Arbeit“?](https://stackoverflow.com/questions/12595136/why-cant-the-compiler-jvm-just-make-autoboxing-just-work)

Das obige ist der detaillierte Inhalt vonJava-Ganzzahlvergleich: Wann sollte ich „==' vs. „equals()' verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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