這是因爲Integer緩存。
從java language specification 5.1.7
If the value p being boxed is true, false, a byte, or a char in the range
\u0000 to \u007f, or an int or short number between -128 and 127 (inclusive),
then let r1 and r2 be the results of any two boxing conversions of p.
It is always the case that r1 == r2.
理想情況下,拳擊給定的原始值p,將總是產生相同的參考。
Integer i = Integer.valueOf(127);
Integer j = Integer.valueOf(127);
i
都和j
指向相同的對象。隨着該值小於127
Integer k = Integer.valueOf(128);
Integer l = Integer.valueOf(128);
兩個k
& l
指向不同的對象。由於該值大於127.
由於您正在使用==
運算符檢查對象引用,因此會得到不同的結果。
更新
您可以使用equals()
方法來得到相同的結果
System.out.println(i.equals(j));//equals() compares the values of objects not references
System.out.println(k.equals(l));//equals() compares the values of objects not references
輸出是
true
true
==
操作員檢查實際的對象引用。
equals()
檢查對象的值(內容)。
回答評論
你,
Integer i = Integer.valueOf(127);
這裏創建新對象&參考分配給i
Integer j = Integer.valueOf(127); //will not create new object as it already exists
由於整數高速緩存(數字在-128到127之間),以前創建的對象引用被分配給j
,則i
和j
指向相同的對象。
現在考慮,
Integer p = Integer.valueOf(127); //create new object
Integer q = Integer.valueOf(126); //this also creates new object as it does not exists
顯然使用==
運營商和equals()
方法兩張支票將導致false
。由於兩者都是不同的參考,並有不同的價值。
這已經在這裏討論: http://stackoverflow.com/questions/3130311/weird-integer-boxing-in-java 這裏: http://stackoverflow.com/questions/1514910/when-comparing-two-integers-in-java-does-auto-unboxing-occur –