Ich habe Integer, die gleich sein sollen (und ich verifiziere es durch Ausgabe). Aber in meiner if
Bedingung erkennt Java nicht, dass diese Variablen den gleichen Wert haben.Warum Java nicht sieht, dass Ganzzahlen gleich sind?
Ich habe den 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 erzeugen die folgende Ausgabe:
FINE: >>>>>> different
FINE: Compare:: 60,145 -> 60,145
Wahrscheinlich muss ich hinzufügen, dass point
so definiert:
Integer[] point = new Integer[2];
und pay
uns aus dem Schleifenkonstruktor genommen:
for (Integer[] pay : payoffs2exchanges.keySet())
Also, diese beiden Variablen haben beide den Integer-Typ.
, wenn Sie einen offenen Geist haben, dann können Sie meine Erklärung mag ... Es ist, weil die Java Schöpfer fürstlich geschraubt, wenn sie die Wrapper-Klassen machen beschlossen, die wirklich erbärmlich Leistung haben (Sie nicht haben Idee über den Abfall, der durch das Umschließen eines * int * innerhalb eines * Integer *) erzeugt wird. Sie taten das hauptsächlich, weil sie nicht in der Lage waren, etwas sauberes und effizientes zu gestalten, wie zum Beispiel * Troves * s * TLongIntHashMap *. Natürlich erwarten snarky kniejerk upvoted Kommentare hier von Leuten, die die Java Cool-Hilfe getrunken haben und erklären, wie ich falsch liege und wie Wrapperklassen ein Glücksfall sind;) – SyntaxT3rr0r
BTW, mach niemals ein * neues Integer [2] * weil du das erzwingst Erstellung eines neuen Objekts. ** IFF ** Du verwendest immer Wrapper-Klassen wie * Integer * (das solltest du eigentlich nicht, aber das ist ein anderes Thema), du willst ein * Integer.valueOf (2) * machen (was später ** garantiert **) Laut den Java-Spezifikationen die Wiederverwendung der ersten 256 Integer-Objekte von -128 bis 127, aber das ist kein sehr bekannter Java-Brainfart. – SyntaxT3rr0r
SpoonBender: Was ist mit der Entscheidung der Java-Ersteller * nur * dem Operator das Überladen von Strings zu erlauben? Auf diese Weise 'Integer.valueOf (127) == Integer.valueOf (127)' aber 'Integer.valueOf (128)! = Integer.valueOf (128)'! – Gabe