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().
Jes*_*per 13
Run Code Online (Sandbox Code Playgroud)if (x.equals(y))这看起来像是一项昂贵的操作.是否有以这种方式计算的哈希码?
这不是一项昂贵的操作,也没有计算哈希码.Java没有神奇地计算哈希码,equals(...)只是一个方法调用,与任何其他方法调用没有什么不同.
JVM很可能甚至会优化方法调用(内联方法中的内部比较),因此这个调用并不比使用==两个原始int值贵得多.
注意:不要过早地应用微优化; 你的假设如"这必须很慢"很可能是错误的或无关紧要,因为代码不是性能瓶颈.
小注意:从Java 1.7开始,Integer类有一个静态compare(Integer, Integer)方法,所以你可以调用它Integer.compare(x, y)并完成它(关于优化的问题除外).
当然,该代码与1.7之前的Java版本不兼容,因此我建议使用,x.compareTo(y)而是兼容1.2.
我会选择x.equals(y),因为这是检查所有类的相等性的一致方法.
就性能而言,equals实际上更昂贵,因为它最终调用intValue().
编辑:在大多数情况下你应该避免自动装箱.它可能会让人感到困惑,特别是作者不知道他在做什么.你可以尝试这个代码,你会对结果感到惊讶;
Integer a = 128;
Integer b = 128;
System.out.println(a==b);
Run Code Online (Sandbox Code Playgroud)