小编典典

为什么这些==而不是`equals()`?

java

对于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]
  1. X == Y不能编译是可以预料的,是不同的对象。
  2. 令我有些惊讶的Y == 9true,默认情况下9是an int,并且1)甚至没有编译。请注意,您不能将int放入期望使用的方法中Short,但是在这里它们是相等的。
  3. 由于两个相同的原因,这令人惊讶,但似乎更糟。
  4. 不足为奇,因为自动x装箱到和Integer
  5. 不足为奇,因为不同类中的对象不应该是equal()
  6. 什么?? X == ytrue但是X.equals(y)false?难道不应该==总是比equals()

如果有人能帮助我理解这一点,我将不胜感激。由于什么原因,==和equals()会以这种方式运行?

编辑: 我已将9更改为9000,以表明此行为与-128到127的整数的行为无关。

2 次编辑: OK,如果你认为你明白这东西,你应该考虑以下内容,只是为了确保:

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]

据我所知,其原因是:

  1. 不同的实例,如此不同。
  2. X 拆箱,然后相同的值,所以相等。
  3. 相同的值,相等。
  4. y不能装箱,Integer所以不能相等。

阅读 216

收藏
2020-09-16

共1个答案

小编典典

的原因

X == y

正确与二进制数值提升有关。当至少一个等于运算符的操作数可转换为数值类型时,将使用数值等于运算符。首先,第一个操作数被取消装箱。然后,两个操作数都转换为int

X.equals(y)

是正常的函数调用。如前所述,y将自动装箱到一个Short对象。Integer.equals如果参数不是Integer实例,则始终返回false
。通过检查实现可以很容易地看出这一点。

有人可能会说这是设计缺陷。

2020-09-16