我如何比较两个整数?

Dan*_*ski 34 java comparison object-comparison

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

Integer x = ...
Integer y = ...
Run Code Online (Sandbox Code Playgroud)

我能想到这个:

if (x == y) 
Run Code Online (Sandbox Code Playgroud)

==运营商只比较基准,因此这将仅适用于较低的整数值工作.但也许自动拳击踢......?

if (x.equals(y)) 
Run Code Online (Sandbox Code Playgroud)

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

if (x.intValue() == y.intValue())
Run Code Online (Sandbox Code Playgroud)

有点冗长......

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

Jef*_*eff 33

这就是equals方法的作用:

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,没有哈希代码计算,但还有一些其他操作发生在那里.虽然x.intValue() == y.intValue()可能会稍微快一点,但你会进入那里的微优化领域.此外,编译器可能会优化equals()呼叫,但我不确定.

我通常会使用原语int,但如果我必须使用Integer,我会坚持equals().


sve*_*son 26

使用该equals方法.你为什么这么担心它的价格昂贵?

  • 不要关心微优化. (10认同)

Jes*_*per 13

if (x.equals(y))
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • equals是一个`instanceof`*check*,一个`cast`和一个对`intValue()`的调用,在真正的`==`之前.当然不是做一些过早优化的理由. (2认同)

ktb*_*biz 9

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

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


ZZ *_*der 8

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

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

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

Integer a = 128;
Integer b = 128;

System.out.println(a==b);
Run Code Online (Sandbox Code Playgroud)