wake-up-neo.com

Warum sieht Java nicht, dass ganze Zahlen gleich sind?

Ich habe ganze Zahlen, die gleich sein sollen (und ich überprüfe es durch Ausgabe). In meinem Zustand if sieht Java jedoch nicht, dass diese Variablen denselben Wert haben.

Ich habe folgenden Code:

if (pay[0]==point[0] && pay[1]==point[1]) {
    game.log.fine(">>>>>> the same");
} else {
    game.log.fine(">>>>>> different");
}
game.log.fine("Compare:" + pay[0] + "," + pay[1] + " -> " + point[0] + "," + point[1]);

Und es erzeugt die folgende Ausgabe:

FINE: >>>>>> different
FINE: Compare:: 60,145 -> 60,145

Wahrscheinlich muss ich hinzufügen, dass point so definiert ist:

Integer[] point = new Integer[2];

und pay us aus dem loop-Konstruktor:

for (Integer[] pay : payoffs2exchanges.keySet())

Diese beiden Variablen haben also beide den Typ Integer.

21
Roman

Objekte (wie Integers) sollten nicht mit == verglichen werden, sondern mit .equals().

Es ist wichtig zu verstehen, dass mehrere unterschiedliche Integer -Objekte denselben int-Wert darstellen können. Wenn Ihr Programm >>> different ausgibt, heißt es einfach, dass das erste Objekt nicht dasselbe Objekt wie das zweite Objekt ist. (Wahrscheinlich möchten Sie die Objekte anhand des Werts vergleichen, den sie darstellen.)

Aus dem offiziellen Führer über Autoboxen:

[...] Der Operator == führt Referenzidentitätsvergleiche für Ganzzahlausdrücke und Wertgleichheitsvergleiche für Ganzzahlausdrücke durch. [...]

Es kann erwähnenswert sein, dass Autoboxing garantiert dasselbe Objekt für ganzzahlige Werte im Bereich [-128, 127] zurückgibt, aber eine Implementierung kann nach eigenem Ermessen Werte außerhalb dieses Bereichs zwischenspeichern.

Meine allgemeine Empfehlung ist, int anstelle von Integer für alle lokalen/Mitgliedsvariablen zu verwenden. In diesem speziellen Fall scheinen Sie Koordinaten in einem 2-Element-Array zu speichern. Ich würde vorschlagen, dass Sie dies in einer Coordinates-Klasse oder ähnlichem einkapseln und die equals-Methode (und den hashCode) hier überschreiben.

Siehe auch

54
aioobe

Wenn es einfache int Typen wären, würde es funktionieren.

Verwenden Sie für Integer.intValue() oder compareTo(Object other) oder equals(Object other) in Ihrem Vergleich.

11
sje397

Hierbei sind zwei Arten zu unterscheiden:

  • int, der primitive Integer-Typ, den Sie am häufigsten verwenden, der jedoch kein Objekttyp ist
  • Integer, ein Objektwrapper um eine int, mit dem Ganzzahlen in APIs verwendet werden können, die Objekte erfordern
4

In Java werden numerische Werte im Bereich von -128 bis 127 zwischengespeichert, wenn Sie versuchen zu vergleichen

Integer i=12 ;
Integer j=12 ; // j is pointing to same object as i do.
if(i==j)
   print "true";

dies würde funktionieren, aber wenn Sie versuchen, Zahlen außerhalb des oben angegebenen Bereichs zu verwenden, müssen diese mit der Methode equals für den Wertevergleich verglichen werden, da "==" prüft, ob beide dasselbe Objekt und nicht der gleiche Wert sind.

2

wenn Sie versuchen, zwei Objekte zu vergleichen (und eine Ganzzahl ist ein Objekt, keine Variable), ist das Ergebnis immer, dass sie nicht gleich sind.

in deinem Fall solltest du Felder der Objekte vergleichen (in diesem Fall intValue)

wenn Sie versuchen, int-Variablen anstelle von Integer-Objekten zu deklarieren, hilft dies

1
Andrzej Bobak

Der Zustand bei

pay[0]==point[0]

ausdruck, verwendet den Gleichheitsoperator ==, um eine Referenz zu vergleichen

Integer pay[0]

für die Gleichheit mit der a-Referenz

Integer point[0]

Wenn primitive Werte (wie int, ...) mit == verglichen werden, ist das Ergebnis im Allgemeinen wahr, wenn beide Werte identisch sind. Wenn Referenzen (wie Integer, String, ...) mit == verglichen werden, ist das Ergebnis wahr, wenn beide Referenzen auf dasselbe Objekt im Speicher verweisen. Um den tatsächlichen Inhalt (oder die Statusinformationen) von Objekten auf Gleichheit zu vergleichen, muss eine Methode aufgerufen werden. Also damit

Integer[] point = new Integer[2];

ausdruck Sie erstellen ein neues Objekt mit einer neuen Referenz und weisen es der Punktvariablen zu.

Zum Beispiel:

int a = 1;
int b = 1;
Integer c = 1;
Integer d = 1;
Integer e = new Integer(1);

So vergleichen Sie a mit b:

a == b

weil beide primitive Werte sind.

So vergleichen Sie a mit c:

a == c

wegen der Auto-Boxing-Funktion.

zum Vergleich c mit e verwenden:

c.equals(e)

wegen neuer referenz in e variable.

zum Vergleich von c mit d ist die Verwendung besser und sicherer:

  c.equals(d)

durch:

Wie Sie wissen, testet der Operator ==, der auf Wrapper-Objekte angewendet wird, nur, ob die Objekte identische Speicherorte haben. Der folgende Vergleich würde daher wahrscheinlich scheitern:

Integer a = 1000;
Integer b = 1000;
if (a == b) . . .

Bei einer Java-Implementierung können jedoch häufig vorkommende Werte in identische Objekte eingeschlossen werden, sodass der Vergleich möglicherweise erfolgreich ist. Diese Mehrdeutigkeit ist nicht das, was Sie wollen. Abhilfe schafft der Aufruf der equals-Methode beim Vergleich von Wrapper-Objekten.

0
MMKarami