我对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()
更严格吗?
如果有人能帮我理解这些,我会非常感激。为什么==
和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
,因此不能相等。