Я немного смущен тем, как 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]
- То, что
X == Yне компилируется, следует ожидать, будучи разными объектами. - Я немного удивлен тем, что
Y == 9true, учитывая, что по умолчанию 9 имеет значениеintи при условии, что 1) даже не компилируется. Обратите внимание, что вы не можете поместитьintв метод, ожидающийShort, но здесь они равны. - Это удивительно по той же причине, что и два, но кажется хуже.
- Не удивительно, поскольку
xавтобоксация иInteger. - Не удивительно, поскольку объекты в разных классах не должны быть
equal(). - Что??
X == Ytrue, ноX.equals(y)естьfalse? Не должен ли==быть более строгим, чемequals()?
Буду признателен, если кто-нибудь поможет мне разобраться в этом. По какой причине do == и equals() ведут себя таким образом?
Изменить: Я изменил 9-9000, чтобы показать, что это поведение не связано с каким-либо необычным способом поведения целых чисел от -128 до 127.
2 nd Изменить: Хорошо, если вы считаете, что понимаете этот материал, вы должны учитывать следующее: просто
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]
Причина, насколько я понимаю:
- Различные экземпляры, разные.
-
xunboxed, то такое же значение, равное. - То же значение, равное.
-
yне может быть помещен в ячейкуInteger, поэтому не может быть равным.