Por que estes são == mas não `equals ()`?

Estou um pouco confuso sobre a maneira como o Java trata== eequals() quando se trata deint, Integer e outros tipos de números. Por exemplo:

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

saídas (talvez você deva fazer sua suposição primeiro):

[true, true, true, false, false]
queX == Y não compilar é de se esperar, sendo objetos diferentes.Estou um pouco surpreso queY == 9 étrue, dado que 9 é por padrão uminte dado que 1) nem compilou. Note que você não pode colocar umint em um método esperando umShort, mas aqui eles são iguais.Isto é surpreendente pela mesma razão que dois, mas parece pior.Não é surpreendente, comox é autoboxed para eInteger.Não é de surpreender, pois objetos em diferentes classes não devem serequal().O que??X == y étrue masX.equals(y) éfalse? Não deve== sempre ser mais rigoroso do queequals()?

Eu apreciaria se alguém pudesse me ajudar a entender isso. Por que razão == e equals () se comportam dessa maneira?

Editar: Eu mudei 9 para 9000 para mostrar que esse comportamento não está relacionado a qualquer maneira incomum que os números inteiros de -128 a 127 se comportem.

2nd Editar: OK, se você acha que entende essas coisas, considere o seguinte, só para ter certeza:

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

saídas:

[false, true, true, false]

A razão, tanto quanto eu entendo:

Instância diferente, tão diferente.X unboxed, então mesmo valor, tão igual.Mesmo valor, tão igual.y não pode ser encaixotado a umInteger então não pode ser igual.

questionAnswers(8)

yourAnswerToTheQuestion