【问题标题】:Comparing Integer and int with == [duplicate]将整数和 int 与 == 进行比较 [重复]
【发布时间】:2021-08-21 00:08:31
【问题描述】:
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)
...

以上条件返回true

为什么会这样? sn-ps有什么区别?

【问题讨论】:

  • 区别在于自动拆箱。在第一次比较中,您使用== 比较两个Integer 对象,这仅在它们是相同的对象 时为真(即,如果它们是具有相同值的不同对象,它们将不会比较相等) .在第二种情况下,您将它们都拆箱成int 值,其中== 比较实际值(因为这是int 唯一拥有的东西)。
  • test.get(1)==test.get(0) 比较引用相等性(因为test.get(...) 返回Integer),而int a=test.get(1); int b=test.get(0); if(a==b) { ... }Integers 自动装箱为ints,然后比较值相等性。

标签: java integer wrapper autoboxing unboxing


【解决方案1】:

在一种情况下,您正在比较两个 Integer 对象引用。在另一种情况下,您正在比较两个ints。当使用== 运算符比较对象引用时,如果它们不是同一个对象,它将返回False,即使它们包装了相同的值。

【讨论】:

    【解决方案2】:
    • 在第一个示例中,您正在比较参考。在您的示例中,您有两个具有不同引用和相同值的不同对象。

    • 在第二个示例中,您正在使用自动拆箱,它在堆栈内存中创建新整数,并且整数比较可以按照您的预期工作。自动拆箱会在 null 的情况下产生 NullPointerException。

    【讨论】:

      【解决方案3】:

      第一个代码片段: 您正在比较对象引用,这意味着对象也指向的特定对象引用。在这种情况下,您正在比较一个 Integer,它是 int 的包装类。

      第二段代码: 您正在将一个“int”与另一个“int”进行比较。

      示例:

      这样想:如果两个人的名字都叫 John,在第一个场景中,我们比较的是名字为 John 的人,而在第二个场景中,我们只比较名字为 John。希望对您有所帮助!

      【讨论】:

      • 我觉得你的回答有点没抓住重点。即Integerint 之间的区别,即包装类。除此之外,当然是正确的。
      • @Zabuzard 啊,好吧,我对我的答案进行了编辑以解决这个问题!谢谢你告诉我
      猜你喜欢
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多