我如何比较两个整数?

时间:2009-12-09 13:18:54

标签: java comparison object-comparison

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

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

我能想到这个:

if (x == y) 

==运算符仅比较引用,因此这仅适用于较低的整数值。但也许自动拳击会踢......?

if (x.equals(y)) 

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

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

有点冗长......

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

9 个答案:

答案 0 :(得分: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()

答案 1 :(得分:26)

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

答案 2 :(得分:13)

if (x.equals(y))
     

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

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

JVM很可能甚至会优化方法调用(内联方法中的内部比较),因此这个调用并不比在两个原始==值上使用int贵得多

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

答案 3 :(得分:9)

次要注意:自Java 1.7以来,Integer类具有静态compare(Integer, Integer)方法,因此您只需调用Integer.compare(x, y)并完成它(关于优化的问题除外)。

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

答案 4 :(得分:8)

我会使用x.equals(y),因为这是检查所有类的相等性的一致方法。

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

编辑:在大多数情况下,您应该避免自动装箱。它可能会让人感到困惑,特别是作者不知道他在做什么。您可以尝试使用此代码,您会对结果感到惊讶;

Integer a = 128;
Integer b = 128;

System.out.println(a==b);

答案 5 :(得分:2)

“等于”就是这样。为了安全起见,你应该测试null-ness:

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

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

如果经常调用代码,JIT会内联代码,因此性能考虑应该无关紧要。

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

[补充]

此外,需要进行空检查以保证相等性测试是对称的 - x.equals(y)应与y.equals(x)相同,但如果其中一个为null,则不需要。

答案 6 :(得分:2)

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

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

}

答案 7 :(得分:1)

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

x.compareTo(y) == 0

另外,如果不是相等,那么你想要比较这些整数,

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

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

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

答案 8 :(得分:1)

我刚刚在我的代码中遇到过这个问题,我花了一些时间才弄明白。我正在做两个排序列表的交集,并且只在我的输出中得到小数字。在比较期间,我可以使用(x - y == 0)代替(x == y)来使其工作。