我必须比较两个Integer
个对象(不是int
)。比较它们的规范方法是什么?
Integer x = ...
Integer y = ...
我能想到这个:
if (x == y)
==
运算符仅比较引用,因此这仅适用于较低的整数值。但也许自动拳击会踢......?
if (x.equals(y))
这看起来像是一项昂贵的操作。是否有以这种方式计算的哈希码?
if (x.intValue() == y.intValue())
有点冗长......
编辑:感谢您的回复。虽然我知道现在要做什么,事实是分布在所有现有的答案(甚至是已删除的答案:)),我真的不知道,接受哪一个。所以我会接受最好的答案,它指的是所有三种比较可能性,或者至少是前两种。
答案 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)
来使其工作。