java中int和Integer比較
一,類型區別
我們知道java中由兩種數據類型,即基本類型和對象類型,int就是基本數據類型,而Integer是一個class,也習慣把Integer叫做int的包裝類。
二,聲明或實例化時區別
基本類型int在使用時可以在聲明時直接初始化,如int a=0;
而Integer作為一個class肯定要通過其構造方法來實例化啦,如:Integer i=new Integer(0);
三,自動拆包
什么是自動拆包?前面說Integer是int的包裝類,拆包就是拆的Integer的包。
對象的比較是通過equal()方法來比較的,但你肯定見過如下操作:
Integer i=new Integer(10);
int j=10;
System.out.println(i==j);//輸出true
兩個對象如果直接用判斷程序比較的是兩個對象的內存地址(不知道對象和引用的關系推薦文章: 鏈接 ),也就是說只有同一個對象使用才會返回true,那為什么這里也會返回true呢。
原因就是java的自動拆包機制啦,當一個基本類型和一個包裝類型比較時,包裝類型會被自動拆包進行比較。
四,非new產生的Integer
1,非new生成的Integer變量和new Integer()生成的變量比較時,結果為false。(因為非new生成的Integer變量指向的是java常量池中的對象,而new Integer()生成的變量指向堆中新建的對象,兩者在內存中的地址不同)
Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false
2,對於兩個非new生成的Integer對象,進行比較時,如果兩個變量的值在區間-128到127之間,則比較結果為true,如果兩個變量的值不在此區間,則比較結果為false
Integer i = 100;
Integer j = 100;
System.out.print(i == j); //true
Integer i = 128;
Integer j = 128;
System.out.print(i == j); //false
3,java在編譯Integer i = 100 ;時,會翻譯成為Integer i = Integer.valueOf(100)。而java API中對Integer類型的valueOf的定義如下,對於-128到127之間的數,會進行緩存,Integer i = 127時,會將127進行緩存,下次再寫Integer j = 127時,就會直接從緩存中取,就不會new了。
public static Integer valueOf(int i){
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high){
return IntegerCache.cache[i + (-IntegerCache.low)];
}
return new Integer(i);
}
本文部分引用博客:鏈接