How to properly compare two Integers in Java?

前端 未结 10 1351
情歌与酒
情歌与酒 2020-11-21 07:06

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

Integer a = 4;
if (a < 5)

a will automaticall

10条回答
  •  礼貌的吻别
    2020-11-21 07:36

    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.

    If the value p being boxed is an integer literal of type int between -128 and 127 inclusive (§3.10.1), or the boolean literal true or false (§3.10.3), or a character literal between '\u0000' and '\u007f' inclusive (§3.10.4), then let a and b be the results of any two boxing conversions of p. It is always the case that a == b.

    Personally I'd use:

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

    or

    if (x.equals(y))
    

    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.

提交回复
热议问题