对于int,Integer和其他类型的数字,我对Java对待==和equals()的方式感到困惑。例如:
Integer X = 9000;
int x = 9000;
Short Y = 9000;
short y = 9000;
List results = new ArrayList();
// 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是真的,因为9是默认的int,并给出1)甚至没有编译。请注意,您不能将int放入一个期望Short的方法中,但在这里它们是相等的。
>这是令人惊讶的,与两个相同的原因,但它似乎更糟。
>不奇怪,因为x是自动装箱和整数。
>不奇怪,因为不同类中的对象不应该相等()。
>什么? X == y是true,但X.equals(y)是false?不应该总是比equals()更严格?
如果有人能帮助我理解这一点,我会感激的。为什么==和equals()以这种方式行事?
编辑:我已经更改了9到9000,以表明这种行为与整数从-128到127的任何不寻常的方式都不相关。
第二编辑:好的,如果你认为你明白这个东西,你应该考虑以下几点,只是为了确保:
Integer X = 9000;
Integer Z = 9000;
short y = 9000;
List results = new ArrayList();
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不能被包装到整数,所以不能相等。