34

我必须比较两个Integer对象(不是int)。比较它们的规范方法是什么?

Integer x = ...
Integer y = ...

我能想到这个:

if (x == y) 

==运算符仅比较引用,因此这仅适用于较低的整数值。但也许自动装箱开始了......?

if (x.equals(y)) 

这看起来像一个昂贵的操作。有没有以这种方式计算的哈希码?

if (x.intValue() == y.intValue())

有点啰嗦...

编辑:感谢您的回复。尽管我现在知道该做什么,但事实分布在所有现有答案(甚至已删除的答案上:)),我真的不知道该接受哪一个。所以我会接受最好的答案,它指的是所有三种比较可能性,或者至少是前两种。

4

9 回答 9

33

这就是 equals 方法的作用:

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

如您所见,没有哈希码计算,但那里发生了一些其他操作。虽然x.intValue() == y.intValue()可能会稍微快一些,但您正在进入微优化领域。另外,编译器可能会优化equals()调用,尽管我不确定。

我一般会使用原语int,但如果必须使用Integer,我会坚持使用equals()

于 2009-12-09T15:01:28.753 回答
26

使用equals方法。你为什么这么担心它很贵?

于 2009-12-09T13:21:08.343 回答
13
if (x.equals(y))

这看起来像一个昂贵的操作。有没有以这种方式计算的哈希码?

这不是一项昂贵的操作,并且不计算哈希码。Java 不会神奇地计算哈希码,equals(...)只是一个方法调用,与任何其他方法调用没有区别。

JVM 很可能甚至会优化方法调用(内联发生在方法内部的比较),所以这个调用并不比使用==两个原始int值贵多少。

注意:不要过早地应用微优化;您的诸如“这一定很慢”之类的假设很可能是错误的或无关紧要,因为代码不是性能瓶颈。

于 2009-12-09T13:32:56.730 回答
9

小提示:由于 Java 1.7 Integer 类有一个静态compare(Integer, Integer)方法,所以你可以调用Integer.compare(x, y)它并完成它(关于优化的问题除外)。

当然,该代码与 1.7 之前的 Java 版本不兼容,所以我建议x.compareTo(y)改用它,它与 1.2 兼容。

于 2013-12-12T23:27:22.383 回答
8

我会选择 x.equals(y) 因为这是检查所有类是否相等的一致方法。

就性能而言,equals 实际上更昂贵,因为它最终调用 intValue()。

编辑:在大多数情况下,您应该避免自动装箱。它会变得非常混乱,尤其是作者不知道他在做什么。你可以试试这段代码,你会对结果感到惊讶;

Integer a = 128;
Integer b = 128;

System.out.println(a==b);
于 2009-12-09T13:21:33.117 回答
2

“等于”就是它。为了安全起见,您应该测试是否为空:

x == y || (x != null && x.equals(y))

x==y 测试 null==null,恕我直言,这应该是真的。

如果足够频繁地调用代码,JIT 将内联代码,因此性能考虑应该无关紧要。

当然,如果可以的话,避免使用“Integer”而使用普通的“int”是最好的方法。

[添加]

此外,需要空值检查来保证相等测试是对称的——x.equals(y) 应该与 y.equals(x) 相同,但如果其中一个为空,则不是。

于 2009-12-09T13:52:09.677 回答
2

比较整数并按值升序或降序打印其值。您所要做的就是实现 Comparator 接口并覆盖其比较方法并比较其值,如下所示:

@Override
public int compare(Integer o1, Integer o2) {
    if (ascending) {
        return o1.intValue() - o2.intValue();
    } else {
        return o2.intValue() - o1.intValue();
    }

}
于 2014-04-06T21:12:10.457 回答
1

Integer 类实现Comparable<Integer>了,所以你可以尝试,

x.compareTo(y) == 0

此外,如果您希望比较这些整数而不是相等,那么,

x.compareTo(y) < 0会告诉你 x 是否小于 y。

x.compareTo(y) > 0会告诉你 x 是否大于 y。

当然,在这些示例中,明智的做法是在进行这些调用之前确保 x 不为空。

于 2009-12-09T18:51:39.190 回答
1

我刚刚在我的代码中遇到了这个问题,我花了一段时间才弄清楚。我正在做两个排序列表的交集,并且在我的输出中只得到少量数字。(x - y == 0)我可以通过使用而不是(x == y)在比较期间让它工作。

于 2015-04-18T03:01:58.210 回答