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

I know that if you compare a boxed primitive Integer with a constant such as:

Integer a = 4;

if (a < 5)

a will automatically be unboxed and the comparison will work.

However, what happens when you are comparing two boxed Integers and want to compare either equality or less than/greater than?

Integer a = 4;

Integer b = 5;

if (a == b)

Will above code result in checking to see if they are the same object, or will it auto-unbox in that case?

What about:

Integer a = 4;

Integer b = 5;

if (a < b)

?

解决方案

No, == between Integer, Long etc will check for reference equality - i.e.

Integer x = ...;

Integer y = ...;

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

this will check whether x and y refer to the same object rather than equal objects.

So

Integer x = new Integer(10);

Integer y = new Integer(10);

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

is guaranteed to print false. Interning of "small" autoboxed values can lead to tricky results:

Integer x = 10;

Integer y = 10;

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

This will print true, due to the rules of boxing (JLS section 5.1.7). It's still reference equality being used, but the references genuinely are equal.

Personally I'd use:

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

or

if (x.equals(y))

The latter is slightly less efficient - there isn't an overload for Integer.equals(Integer) so it will have to do execution time type checking, whereas the first uses the fact that we already know that both objects are Integers.

Fortunately, compareTo knows about the types, so:

if (x.compareTo(y) < 0)

should still be efficient. Of course, this is micro-optimisation territory and you should use the code you find clearest - after making sure it's correct :)

As you say, for any comparison between a wrapper type (Integer, Long etc) and a numeric type (int, long etc) the wrapper type value is unboxed and the test is applied to the primitive values involved.

This occurs as part of binary numeric promotion (JLS section 5.6.2). Look at each individual operator's documentation to see whether it's applied. For example, from the docs for == and != (JLS 15.21.1):

If the operands of an equality

operator are both of numeric type, or

one is of numeric type and the other

is convertible (§5.1.8) to numeric

type, binary numeric promotion is

performed on the operands (§5.6.2).

and for and >= (JLS 15.20.1)

The type of each of the operands of a

numerical comparison operator must be

a type that is convertible (§5.1.8) to

a primitive numeric type, or a

compile-time error occurs. Binary

numeric promotion is performed on the

operands (§5.6.2). If the promoted

type of the operands is int or long,

then signed integer comparison is

performed; if this promoted type is

float or double, then floating-point

comparison is performed.

Note how none of this is considered as part of the situation where neither type is a numeric type.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值