Warum sind diese == aber nicht `equals ()`?

Ich bin ein bisschen verwirrt darüber, wie Java behandelt wird== undequals() wenn es darum gehtint, Integer und andere Arten von Zahlen. Zum Beispiel:

Integer X = 9000;
int x = 9000;
Short Y = 9000;
short y = 9000;
List<Boolean> results = new ArrayList<Boolean>();
// results.add(X == Y); DOES NOT COMPILE        1)
results.add(Y == 9000);                      // 2)
results.add(X == y);                         // 3)
results.add(X.equals(x));                    // 4)
results.add(X.equals(Y));                    // 5)
results.add(X.equals(y));                    // 6)
System.out.println(results);

Ausgänge (vielleicht sollten Sie zuerst raten):

[true, true, true, false, false]
DasX == Y Kompilieren ist nicht zu erwarten, da es sich um unterschiedliche Objekte handelt.Das überrascht mich ein wenigY == 9 isttruevorausgesetzt, 9 ist standardmäßig einint, und da 1) nicht einmal kompiliert. Beachten Sie, dass Sie keine setzen könnenint in eine Methode erwarten aShortund doch sind sie hier gleich.Dies ist aus dem gleichen Grund wie zwei überraschend, aber es scheint schlimmer.Kein Wunder, wiex ist autoboxed zu undInteger.Kein Wunder, wie Objekte in verschiedenen Klassen nicht sein solltenequal().Was??X == y isttrue aberX.equals(y) istfalse? Sollte nicht== Sei immer strenger alsequals()?

Ich würde es begrüßen, wenn mir jemand helfen kann, dies zu verstehen. Aus welchem ​​Grund verhalten sich == und equals () so?

Bearbeiten: Ich habe 9 zu 9000 geändert, um zu zeigen, dass dieses Verhalten nicht mit ungewöhnlichen Verhaltensweisen der Ganzzahlen von -128 bis 127 zusammenhängt.

2nd Bearbeiten: OK, wenn du denkst, dass du dieses Zeug verstehst, solltest du Folgendes in Betracht ziehen, um sicherzugehen:

Integer X = 9000;
Integer Z = 9000;
short y = 9000;
List<Boolean> results = new ArrayList<Boolean>();
results.add(X == Z);                      // 1)
results.add(X == y);                      // 2)
results.add(X.equals(Z));                 // 3)
results.add(X.equals(y));                 // 4)
System.out.println(results);

Ausgänge:

[false, true, true, false]

Der Grund, so gut ich es verstehe:

Unterschiedliche Instanz, so unterschiedlich.X Unboxed, dann gleicher Wert, also gleich.Gleicher Wert, also gleich.y kann nicht an eine Box angehängt werdenInteger so kann nicht gleich sein.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage