为了账号安全,请及时绑定邮箱和手机立即绑定

如何正确比较Java中的两个整数?

如何正确比较Java中的两个整数?

阿波罗的战车 2019-06-05 16:21:17
如何正确比较Java中的两个整数?我知道,如果您将盒装原语整数与常量进行比较,如:Integer a = 4;if (a < 5)a将自动取消装箱,并且比较将工作。但是,当您比较两个装箱时会发生什么?Integers并且想要比较相等还是小于/大于?Integer a = 4;Integer b = 5;if (a == b)上面的代码会导致检查它们是否是同一个对象,还是在这种情况下自动打开框?那么:Integer a = 4;Integer b = 5;if (a < b)?
查看完整描述

3 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

不,=之间的整数,长等将检查参考相等-即

Integer x = ...;Integer y = ...;System.out.println(x == y);

这将检查是否xy参考同一对象而不是平等物品。

所以

Integer x = new Integer(10);Integer y = new Integer(10);System.out.println(x == y);

保证打印false..“小”自动装箱值的实习可能导致棘手的结果:

Integer x = 10;Integer y = 10;System.out.println(x == y);

这个会打印出来true,由于拳击规则(第5.1.7节)。它仍然使用引用相等,但引用真正的平等。

就我个人而言,我会用:

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

if (x.equals(y))

后者的效率略低一些-没有超载Integer.equals(Integer)因此,它必须执行时类型检查,而第一个使用的事实是,我们已经知道两个对象都是IntegerS.

幸运的是,compareTo知道类型,所以:

if (x.compareTo(y) < 0)

应该还是有效率的。当然,这是微观优化领域,在确保代码正确之后,您应该使用您发现的最清晰的代码:)

如您所述,对于包装器类型之间的任何比较(IntegerLong)和一个数字类型(intlong)包装类型值是开箱并将该测试应用于所涉及的原语值。

这是二进制数字提升的一部分(JLS第5.6.2节)。查看每个操作符的文档,看看它是否被应用。例如,从==!= (JLS 15.21.1):

如果相等运算符的操作数都是数值类型,或者一个是数值类型,另一个可转换为数字类型(§5.1.8),则对操作数执行二进制数值提升(§5.6.2)。

而为了<<=>>= (JLS 15.20.1)

数值比较运算符的每个操作数的类型必须是可转换(§5.1.8)为原始数值类型的类型,否则会发生编译时错误。二进制数字提升在操作数上执行(第5.6.2节)。如果操作数的提升类型为int或long,则执行有符号整数比较;如果此提升类型为Float或Double,则执行浮点比较。

请注意,所有这些都没有被认为是在以下情况中的一部分:两样类型是数字类型。


查看完整回答
反对 回复 2019-06-05
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

==仍将测试对象相等性。然而,很容易被愚弄:


Integer a = 10;

Integer b = 10;


System.out.println(a == b); //prints true


Integer c = new Integer(10);

Integer d = new Integer(10);


System.out.println(c == d); //prints false

包含不平等的示例将起作用,因为它们不是在对象上定义的。但是,随着==比较时,仍将检查对象相等。在这种情况下,当您从装箱原语初始化对象时,将使用相同的对象(同时用于a和b)。这是一个好的优化,因为原语框类是不可变的。


查看完整回答
反对 回复 2019-06-05
?
GCT1015

TA贡献1827条经验 获得超4个赞

因为Java1.7,您可以使用对象.等于:

java.util.Objects.equals(oneInteger, anotherInteger);

如果参数彼此相等,则返回true,否则返回false。因此,如果两个参数都为NULL,则返回true,如果正好有一个参数为NULL,则返回false。否则,通过使用第一个参数的相等方法来确定相等。


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 1532 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信