int、Integer、Integer.valueOf()、new Integer的比較
public class Test{ public static void main(String[] args){ test1(); } public static void test1(){ Integer m=127; Integer n=127; System.out.println(m==n); System.out.println(m.equals(n)); } public static void test2(){ Integer m=127; int n=127; System.out.println(m==n); } public static void test3(){ Integer m=127; Integer n=new Integer(127); System.out.println(m==n); System.out.println(m.equals(n)); } public static void test4(){ Integer m=127; Integer n=Integer.valueOf(127); System.out.println(m==n); System.out.println(m.equals(n)); } public static void test5(){ Integer m=128; Integer n=128; System.out.println(m==n); System.out.println(m.equals(n)); } public static void test6(){ Integer m=128; int n=128; System.out.println(m==n); } public static void test7(){ Integer m=128; Integer n=new Integer(128); System.out.println(m==n); System.out.println(m.equals(n)); } public static void test8(){ Integer m=128; Integer n=Integer.valueOf(128); System.out.println(m==n); System.out.println(m.equals(n)); } }
一一執行上述test1()一直到test8()方法,你的結果能完全對麼?
我根據昨天一筆試題然後總結到這裡的。
有若干個知識點:
1)int 跟Integer、Integer.valueOf()、new Integer()做==比較時,只比較兩者的數值,數值相等即為true.
根據這個原則,test2()和test6()都是輸出為true;
2)When boxing (transforming int
to Integer
)
the compiler uses a cache for small values (-128 - 127) and reuses the same objects for the same values.在-128-127之間時,包括邊界值,Integer m=127,Integer n=Integer.valueOf(127),都會將127裝箱成Integer型別,並且m和n共用同一個127的Integer型別。
根據這個原則,test1()輸出為true,true;
3)當值不在-128-127之內時,Integer m=128,Integer n= 128或者Integer n=Integer.valueOf(128),也會將128裝箱成Integer型別,但這時不再重用同一個Integer物件,而是各自一個了。此時的Integer m=128或Integer m=Integer.valueOf(128),都相當於new了一個Integer物件。
根據這個原則,test5()輸出為false,true
4)當一個int數值用new建立時,無論在不在-128-127之間,都會建立一個Integer物件,而且不會重用
根據這個原則,test3()、test7()都輸出為false,true
5)Integer m=數值和Integer m=Integer.valueOf(數值)的效果一樣的,兩者可以互換。他們在-128-127之內時,會重用Integer,在之外,不會重用。
根據這個原則,test4()輸出為true,true;test8()輸出為false,true
綜上所述,int 跟包裝類做==比較時,只比較數值大小,數值大小相等即為true;Integer m=數值的效果等同於Integer m=Integer.valueOf(數值),數值在-128-127之間時,裝箱後的Integer物件會重用;超過此範圍,裝箱後的Integer物件不會重用;new Integer(數值),總會new一個物件,而且不是new快取中的物件。==比較時,數值大小相等也會false。