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