当前位置: 首页 > 面试题库 >

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

麹鸿煊
2023-03-14
问题内容

对于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所以不能相等。

问题答案:

的原因

X == y

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

X.equals(y)

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

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



 类似资料:
  • 如果我运行deldeldel(“adel”),它会返回一个,但是,adel的长度是4,这意味着最后一个字符串索引是3,为什么str.substring(4,str.length()没有超出范围?

  • 当我只运行预处理器时,输出文件包含20。 然而,据我所知,预处理器只是进行文本替换。所以这就是我认为正在发生的事情(这显然是错误的,但idky): NUM被定义为10 所以我认为输出应该是10而不是20。有什么能解释出哪里出了问题吗?

  • 关于静态和动态之间的区别,我仍然有点困惑。据我所知,动态使用对象,而静态使用类型,动态在运行时解析,而静态在编译时解析。所以this.lastName.compare(s1.last名称)不应该使用动态绑定吗? 钥匙compareTo(list[position-1])使用动态绑定 (this . last name . compare to(S1 . last name))为什么使用静态绑定?

  • 我试图理解背后的动机。如果已经存在类型类和,为什么有必要呢? 诚然,的实例是具体的类型,而的实例需要一个类型参数。(有关有用的解释,请参见Monoid vs MonadPlus。)但是你不能重写任何类型的约束吗 作为和的组合? 从。它的实施是: 我只能使用和实现它: 有人能澄清和之间的真正区别吗?

  • 问题内容: 我已经在Android代码中使用FloatBuffers一段时间了(从一些opengles教程中复制了它),但是我无法确切地理解此构造是什么以及为什么需要它。 例如,我在许多人的代码和android教程中看到了以下代码(或类似代码): 就我所知,这似乎是冗长和混乱的,我只是说它们只是一个浮点数的包装而已。 问题: 与任何其他类型的float集合或简单数组相反,这种类型的类(ByteBu

  • 问题内容: 听说您应该在样式表中使用em而不是像素来定义尺寸和距离。所以问题是,为什么在CSS中定义样式时应该使用em而不是px?有一个很好的例子可以说明这一点吗? 问题答案: 我问这个问题的原因是,我忘记了如何使用em,因为我在CSS中愉快地编程时已经很久了。人们没有注意到我把这个问题笼罩了,因为我并不是在谈论字体本身的大小。我对如何在页面上的 任何给定块元素 上定义样式更感兴趣。 正如Henr