为什么这些是 ==而不是 '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]
- 这不是预期的编译,是不同的对象。
X == Y
- 我有点惊讶,因为9是默认的,并且考虑到1)甚至没有编译。请注意,您不能将 a 放入期望 a 的方法中,但在这里它们是相等的。
Y == 9
true
int
int
Short
- 这与两个原因相同,但似乎更糟。
- 这并不奇怪,自动装箱到 和 .
x
Integer
- 这并不奇怪,因为不同类中的对象不应该是 。
equal()
- 什么?? 是 但是 是 ?不应该总是比 更严格吗?
X == y
true
X.equals(y)
false
==
equals()
如果有人能帮助我理解这一点,我将不胜感激。出于什么原因 == 和 equals() 会以这种方式表现?
编辑:我已将 9 更改为 9000,以表明此行为与从 -128 到 127 的整数的任何异常行为方式无关。
2编辑:好吧,如果你认为你理解这些东西,你应该考虑以下几点,只是为了确保:
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
取消装箱,然后相同的值,所以相等。 - 相同的值,如此相等。
-
y
不能框到一个所以不能相等。Integer