问题描述
mytool
以上条件导致 List<Integer> test = List.of(955,955);
if (test.get(1) == test.get(0))
...
false
上述条件返回List<Integer> test = List.of(955,955);
int a = test.get(1);
int b = test.get(0);
if (a == b)
...
。
为什么会这样?片段之间有什么区别?
解决方法
在一种情况下,您要比较两个 Integer
对象引用。在另一种情况下,您要比较两个 int
。使用 ==
运算符比较对象引用时,如果它们不是同一个对象,即使它们包装了相同的值,它也会返回 False
。
第一个代码片段: 您正在比较对象引用,这意味着对象也指向特定的对象引用。在这种情况下,您正在比较一个整数,它是 int 的包装类。
第二个代码片段: 您正在将“int”与另一个“int”进行比较。
示例:
这样想:如果两个人都叫约翰,在第一个场景中,我们比较名为约翰的人,而在第二个场景中,我们只比较名字约翰。我希望有帮助!
,-
在第一个示例中,您正在比较引用。在您的示例中,您有两个具有不同引用和相同值的不同对象。
-
在第二个示例中,您使用自动拆箱在堆栈内存中创建新整数,并使用整数比较按您的预期工作。自动拆箱会在 null 的情况下产生 NullPointerException。
对象应该与 .equals
方法进行比较。
List<Integer> test = List.of(955,955);
if (test.get(1).equals(test.get(0)))
原始类型(int、double、long...等)可以与 == 进行比较。
但是像 (Integer,Double,Long) 这样的对象必须与 .equals()
进行比较
如果你对对象使用 ==,那么将比较对象的引用,而不是对象包含的实际值。
正如 andrewjames 的评论所示,在某些极端情况下,== 似乎像下面的示例一样正确比较了 2 个整数对象,但这只是一个极端情况。 More info here