Почему это ==, а не `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.