Почему это ==, а не `equals ()`?

Я немного озадачен тем, как трактует Java== а такжеequals() когда дело доходит доint, Integer и другие типы номеров. Например:

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

Выводы (может быть, вы должны сначала угадать):

[true, true, true, false, false]
That X == Y does not compile is to be expected, being different objects. I'm a little surprised that Y == 9 is true, given that 9 is by default an int, and given that 1) didn't even compile. Note that you can't put an int into a method expecting a Short, yet here they are equal. This is surprising for the same reason as two, but it seems worse. Not surprising, as x is autoboxed to and Integer. Not surprising, as objects in different classes should not be equal(). What?? X == y is true but X.equals(y) is false? Shouldn't == always be stricter than equals()?

Я был бы признателен, если бы кто-нибудь мог помочь мне разобраться в этом. По какой причине == и equals () ведут себя таким образом?

Edit:  Я изменил 9 на 9000, чтобы показать, что это поведение не связано с какими-либо необычными способами, которыми ведут себя целые числа от -128 до 127.

2nd Edit:  Хорошо, если вы думаете, что понимаете это, вы должны рассмотреть следующее, просто чтобы убедиться:

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

выходы:

[false, true, true, false]

Причина, насколько я понимаю, такова:

Different instance, so different. X unboxed, then same value, so equal. Same value, so equal. y cannot be boxed to an Integer so cannot be equal.

Ответы на вопрос(7)

Ваш ответ на вопрос