Integer wrapper class and == operator - where is behavior specified?

jmj picture jmj · Apr 7, 2011 · Viewed 7.6k times · Source
Integer integer1 = 127;
Integer integer2 = 127;
System.out.println(integer1 == integer2);//true

integer1 = 128;
integer2 = 128;
System.out.println(integer1 == integer2);//false

I found it returns == (if it is) under the range of -128 - 127 , why is there such specification ?

Answer

Sean Patrick Floyd picture Sean Patrick Floyd · Apr 7, 2011

Because of this code in Integer.valueOf(int):

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

Explanation:

Integer integer1 = 127 is a shortcut for Integer integer1 = Integer.valueOf(127), and for values between -128 and 127 (inclusive), the Integers are put in a cache and returned multiple times, while higher and lower numbers generate new Integers each time.