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

如何正确比较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)

?


阿波罗的战车
浏览 1533回答 3
3回答

POPMUISE

不,=之间的整数,长等将检查参考相等-即Integer&nbsp;x&nbsp;=&nbsp;...;Integer&nbsp;y&nbsp;=&nbsp;...;System.out.println(x&nbsp;==&nbsp;y);这将检查是否x和y参考同一对象而不是平等物品。所以Integer&nbsp;x&nbsp;=&nbsp;new&nbsp;Integer(10);Integer&nbsp;y&nbsp;=&nbsp;new&nbsp;Integer(10);System.out.println(x&nbsp;==&nbsp;y);保证打印false..“小”自动装箱值的实习可能导致棘手的结果:Integer&nbsp;x&nbsp;=&nbsp;10;Integer&nbsp;y&nbsp;=&nbsp;10;System.out.println(x&nbsp;==&nbsp;y);这个会打印出来true,由于拳击规则(第5.1.7节)。它仍然使用引用相等,但引用真正的是平等。就我个人而言,我会用:if&nbsp;(x.intValue()&nbsp;==&nbsp;y.intValue())或if&nbsp;(x.equals(y))后者的效率略低一些-没有超载Integer.equals(Integer)因此,它必须执行时类型检查,而第一个使用的事实是,我们已经知道两个对象都是IntegerS.幸运的是,compareTo知道类型,所以:if&nbsp;(x.compareTo(y)&nbsp;<&nbsp;0)应该还是有效率的。当然,这是微观优化领域,在确保代码正确之后,您应该使用您发现的最清晰的代码:)如您所述,对于包装器类型之间的任何比较(Integer,&nbsp;Long)和一个数字类型(int,&nbsp;long)包装类型值是开箱并将该测试应用于所涉及的原语值。这是二进制数字提升的一部分(JLS第5.6.2节)。查看每个操作符的文档,看看它是否被应用。例如,从==和!=&nbsp;(JLS 15.21.1):如果相等运算符的操作数都是数值类型,或者一个是数值类型,另一个可转换为数字类型(§5.1.8),则对操作数执行二进制数值提升(§5.6.2)。而为了<,&nbsp;<=,&nbsp;>和>=&nbsp;(JLS 15.20.1)数值比较运算符的每个操作数的类型必须是可转换(§5.1.8)为原始数值类型的类型,否则会发生编译时错误。二进制数字提升在操作数上执行(第5.6.2节)。如果操作数的提升类型为int或long,则执行有符号整数比较;如果此提升类型为Float或Double,则执行浮点比较。请注意,所有这些都没有被认为是在以下情况中的一部分:两样类型是数字类型。

Cats萌萌

==仍将测试对象相等性。然而,很容易被愚弄:Integer a = 10;Integer b = 10;System.out.println(a == b); //prints trueInteger c = new Integer(10);Integer d = new Integer(10);System.out.println(c == d); //prints false包含不平等的示例将起作用,因为它们不是在对象上定义的。但是,随着==比较时,仍将检查对象相等。在这种情况下,当您从装箱原语初始化对象时,将使用相同的对象(同时用于a和b)。这是一个好的优化,因为原语框类是不可变的。

GCT1015

因为Java1.7,您可以使用对象.等于:java.util.Objects.equals(oneInteger,&nbsp;anotherInteger);如果参数彼此相等,则返回true,否则返回false。因此,如果两个参数都为NULL,则返回true,如果正好有一个参数为NULL,则返回false。否则,通过使用第一个参数的相等方法来确定相等。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java