Dlaczego te == ale nie `równe ()`?

Jestem trochę zdezorientowany tym, jak traktuje Java== iequals() Jeśli chodzi oint, Integer i inne rodzaje liczb. Na przykład:

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);

wyjścia (może powinieneś najpierw zgadnąć):

[true, true, true, false, false]
ŻeX == Y nie należy się kompilować, ponieważ są to różne obiekty.Jestem trochę zaskoczonyY == 9 jesttrue, biorąc pod uwagę, że 9 jest domyślnie aninti biorąc pod uwagę, że 1) nawet się nie skompilował. Zauważ, że nie możesz umieścićint do metody oczekującejShort, ale tutaj są równe.Jest to zaskakujące z tego samego powodu co dwa, ale wydaje się gorsze.Nic dziwnego, jakx jest autoboxowany do iInteger.Nic dziwnego, ponieważ obiekty w różnych klasach nie powinny byćequal().Co??X == y jesttrue aleX.equals(y) jestfalse? Nie powinienem== zawsze być bardziej surowe niżequals()?

Byłbym wdzięczny, gdyby ktoś pomógł mi to zrozumieć. Z jakiego powodu zachowują się w ten sposób == i równa się ()?

Edytować: Zmieniłem 9 na 9000, aby pokazać, że to zachowanie nie jest związane z żadnymi nietypowymi sposobami zachowywania się liczb całkowitych od -128 do 127.

2nd Edytować: OK, jeśli uważasz, że rozumiesz te rzeczy, powinieneś rozważyć następujące kwestie, aby upewnić się:

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);

wyjścia:

[false, true, true, false]

Powód, najlepiej jak rozumiem:

Inna instancja, tak inna.X niepakowany, a następnie ta sama wartość, tak równa.Ta sama wartość, taka sama.y nie można zapakować doInteger więc nie może być równy.

questionAnswers(7)

yourAnswerToTheQuestion