【问题标题】:Integer comparisons in JavaJava中的整数比较
【发布时间】:2021-11-01 14:54:24
【问题描述】:

最近在一次编程竞赛中(我使用了 java8,尽管我可以使用任何其他语言),我遇到了这个问题。请帮助我理解这个问题。

我不得不在某一时刻写下这个声明。所有可见的测试用例都通过了。但是当我提交代码时,我可以看到 6/15 的测试用例失败了。

// list1 and list2 are ArrayList<Integer> type
if(list1.get(i) == list2.get(i){
...
...
}

我不知道我在想什么,但我把上面的代码改成了这样。

if(Integer.compare(list1.get(i), list2.get(i))==0){
...
...
}

现在,所有的测试用例都通过了。 有人可以帮我理解为什么测试用例在第一个代码中失败了吗?

0

【问题讨论】:

  • "list1.get(i) == list2.get(i)==0" - This does not compile.
  • Integer 是一个对象。因此,与int 不同,您不能仅将它们与== 进行比较,应该使用equals。将整数与== 进行比较适用于特定范围(-127 到 128 afaik)的事实是因为值的对象在内部被缓存和重用。见stackoverflow.com/questions/20897020/…
  • "Integer.compare(list1.get(i), list2.get(i))==0" 已编辑。 @图灵85
  • 我建议使用Objects.equals(list1.get(i), list2.get(i))。这在语义上等同于 Integer.compare(list1.get(i), list2.get(i))==0,但 a) 更易于阅读和理解 b) 避免了不必要的拆箱。

标签: java integer comparison


【解决方案1】:

由于整数值的某些缓存或幸运地比较了相同的对象引用,任何成功的比较都是偶然的。但是列表包含对象。在这种情况下,整数包装类。因此,请执行以下操作之一来测试是否相等。

if (list1.get(i).compareTo(list2.get(i)) == 0) {
...
}

if (list.get(i).equals(list2.get(i))) {
   ...
}

永远不要使用== 测试对象是否相等。始终使用equals()。要进行不等式测试,例如&lt; and &gt;,请使用compareTo,它在Comparable interface Java 文档中定义。

【讨论】:

    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 2014-11-07
    • 2012-05-29
    • 2013-01-31
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多