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