1. 程式人生 > >int、Integer、Integer.valueOf()、new Integer的比較

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。