Ab Java 1.5, können Sie ziemlich viel Austausch Integer
mit int
in vielen Situationen.
Ich habe jedoch einen möglichen Fehler in meinem Code gefunden, der mich ein wenig überrascht hat.
Der folgende Code:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
schien die Nichtübereinstimmung falsch einzustellen, wenn die Werte gleich waren, obwohl ich nicht feststellen kann, unter welchen Umständen. Ich habe in Eclipse einen Haltepunkt gesetzt Integer
und festgestellt, dass beide Werte 137 sind. Ich habe den booleschen Ausdruck überprüft und festgestellt, dass er falsch ist. Als ich darüber trat, wurde die Nichtübereinstimmung auf true gesetzt.
Ändern der Bedingung in:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
Das Problem wurde behoben.
Kann jemand etwas Licht ins Dunkel bringen, warum dies passiert ist? Bisher habe ich das Verhalten auf meinem lokalen Host nur auf meinem eigenen PC gesehen. In diesem speziellen Fall hat der Code etwa 20 Vergleiche erfolgreich bestanden, ist jedoch bei 2 fehlgeschlagen. Das Problem war durchweg reproduzierbar.
Wenn es sich um ein weit verbreitetes Problem handelt, sollte es in unseren anderen Umgebungen (Entwickler und Test) Fehler verursachen. Bisher hat jedoch niemand das Problem nach Hunderten von Tests gemeldet, bei denen dieses Code-Snippet ausgeführt wurde.
Ist es immer noch nicht legitim, ==
zwei Integer
Werte zu vergleichen ?
Zusätzlich zu all den feinen Antworten unten enthält der folgende Stackoverflow-Link einige zusätzliche Informationen. Es hätte tatsächlich meine ursprüngliche Frage beantwortet, aber da ich Autoboxing in meiner Frage nicht erwähnt habe, wurde es in den ausgewählten Vorschlägen nicht angezeigt:
Warum kann der Compiler / die JVM Autobobing nicht einfach "einfach funktionieren" lassen?
Sie können zwei nicht
Integer
mit einfachen==
Objekten vergleichen, sodass die Referenzen in den meisten Fällen nicht identisch sind.Es gibt einen Trick, bei dem
Integer
zwischen -128 und 127 Referenzen dieselben sind wie bei Autoboxing-Anwendungen, beiInteger.valueOf()
denen kleine Ganzzahlen zwischengespeichert werden.Ressourcen:
Zum gleichen Thema:
quelle
new Integer(1) == new Integer(1)
ist immer noch falsch.new ... == new ...
ist immerfalse
.equals()
wenn Sie mit Objekten arbeiten. Dies sollte eines der ersten Dinge sein, die man beim Erlernen von Java wissen sollte. Übrigens hätte ich vermutet, dass der Konstruktor vonInteger
privat war, dh dass Instanzen immer durch dievalueOf()
Methode erstellt wurden. Aber ich sehe, dass der Konstruktor öffentlich ist.Das Problem ist, dass Ihre beiden Integer-Objekte genau das sind, Objekte. Sie stimmen nicht überein, da Sie Ihre beiden Objektreferenzen vergleichen, nicht die darin enthaltenen Werte. Offensichtlich
.equals
wird überschrieben, um einen Wertevergleich im Gegensatz zu einem Objektreferenzvergleich bereitzustellen.quelle
Integer
bezieht sich auf die Referenz, dh wenn Sie Referenzen vergleichen, die Sie vergleichen, wenn sie auf dasselbe Objekt verweisen, nicht auf den Wert. Daher das Problem, das Sie sehen. Der Grund, warum es mit einfachenint
Typen so gut funktioniert, ist, dass es den in der enthaltenen Wert entpacktInteger
.Darf ich hinzufügen, dass, wenn Sie das tun, was Sie tun, warum die
if
Aussage zunächst beginnen sollte?quelle
"==" vergleicht immer den Speicherort oder die Objektreferenzen der Werte. Gleich Methode vergleichen immer die Werte. Equals verwendet aber auch indirekt den Operator "==", um die Werte zu vergleichen.
Integer verwendet den Integer-Cache, um die Werte von -128 bis +127 zu speichern. Wenn der Operator == verwendet wird, um nach Werten zwischen -128 und 127 zu suchen, wird true zurückgegeben. für andere als diese Werte wird false zurückgegeben.
Weitere Informationen finden Sie unter dem Link
quelle
Neben diesen großartigen Antworten habe ich Folgendes gelernt:
quelle
==
Um die korrekte Verwendung zu gewährleisten, können SieInteger
vor dem==
Vergleich einfach einen der verglichenen Werte entpacken , z.Die zweite wird automatisch entpackt (natürlich müssen Sie zuerst nach
null
s suchen ).quelle