Why are these == but not `equals()`?

后端 未结 8 1693
灰色年华
灰色年华 2020-12-01 07:58

I\'m a bit confused about the way Java treats == and equals() when it comes to int, Integer and other types of numbers.

8条回答
  •  情书的邮戳
    2020-12-01 08:49

    A bit more detail on how autoboxing works and how "small" valued Integer objects are cached:

    When a primitive int is autoboxed into an Integer, the compiler does that by replacing the code with a call to Integer.valueOf(...). So, the following:

    Integer a = 10;
    

    is replaced by the compiler with the following:

    Integer a = Integer.valueOf(10);
    

    The valueOf(...) method of class Integer maintains a cache that contains Integer objects for all values between -127 and 128. If you call valueOf(...) with a value that's in this range, the method returns a pre-existing object from the cache. If the value is outside the range, it returns a new Integer object initialized with the specified value. (If you want to know exactly how it works, lookup the file src.zip in your JDK installation directory, and look for the source code of class java.lang.Integer in it.)

    Now, if you do this:

    Integer a = 10;
    Integer b = 10;
    System.out.println(a == b);
    

    you'll see that true is printed - but not because a and b have the same value, but because a and b are referring to the same Integer object, the object from the cache returned by Integer.valueOf(...).

    If you change the values:

    Integer a = 200;
    Integer b = 200;
    System.out.println(a == b);
    

    then false is printed, because 200 is outside the range of the cache, and so a and b refer to two distinct Integer objects.

    It's unfortunate that == is used for object equality for value types such as the wrapper classes and String in Java - it's counter-intuitive.

提交回复
热议问题