int和Integer的區(qū)別
- Integer是int的包裝類;int是基本數(shù)據(jù)類型,長度為32位(4)字節(jié)剪个。
- Integer是Java提供的封裝類,在java.lang.Integer包里面。
- Integer變量必須實例化后才能使用;int變量不需要取董。
- Integer實際是對象的引用,當(dāng)new一個Integer時无宿,實際上是生成一個指針指向此對象茵汰;而int則是直接存儲數(shù)據(jù)值。
- Integer的默認(rèn)值是null孽鸡;int的默認(rèn)值是0
關(guān)于Integer和int的深入比較
- 由于Integer變量實際上是對一個Integer對象的引用蹂午,所以兩個通過new生成的Integer變量永遠是不相等的(因為new生成的是兩個對象,其內(nèi)存地址不同)彬碱。
Integer i = new Integer(100);
integer j = new Integer(100);
System.out.println(i==j);//false
- Integer變量和int變量比較時豆胸,只要兩個變量的值是向等的,則結(jié)果為true(因為包裝類Integer和基本數(shù)據(jù)類型int比較時巷疼,Java會自動拆包裝為int晚胡,然后進行比較,實際上就變?yōu)閮蓚€int變量的比較)
Integer i = new Integer(100);
int j = 100;
System.out.ptintln(i == j); //true
- 非new生成的Integer變量和new Integer()生成的變量比較時嚼沿,結(jié)果為false估盘。(因為 ①當(dāng)變量值在-128~127之間時,非new生成的Integer變量指向的是java常量池中的對象骡尽,而new Integer()生成的變量指向堆中新建的對象遣妥,兩者在內(nèi)存中的地址不同)
Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false
- 對于兩個非new生成的Integer對象,進行比較時攀细,如果兩個變量的值在區(qū)間-128到127之間箫踩,則比較結(jié)果為true,如果兩個變量的值不在此區(qū)間谭贪,則比較結(jié)果為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
對于第4條的原因:
java在編譯Integer i =100 ;時,會翻譯成為Integer i = Integer.valueOf(100);而java API中對Integer類型的valueOf的定義如下:
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);
}
從上面我們可以知道給 Interger 賦予的 int 數(shù)值在 - 128 - 127 的時候俭识,直接從 cache 中獲取吱韭,這些 cache 引用對 Integer 對象地址是不變的,但是不在這個范圍內(nèi)的數(shù)字,則 new Integer (i) 這個地址是新的地址理盆,不可能一樣的.
有了int為什么還要有Integer
- 因為Java語言是面向?qū)ο蟮亩幻海瑢ο蠓庋b可以把屬性(數(shù)據(jù)跟處理這些數(shù)據(jù)的方法)結(jié)合在一起。比如Integer就有parseInt()等方法來專門處理int型相關(guān)的數(shù)據(jù)猿规。
- 在Java中絕大部分方法或類都是用來處理類類型對象的衷快,如ArrayList和LinkedList集合類就只能以類作為它的存儲對象,而這時如果想把一個int型的數(shù)據(jù)存入list是不可能的姨俩,必須把它包裝成類蘸拔,也就是Integer才能被List所接受。
補充:Integer的裝箱和拆箱
- 自動裝箱
將基本數(shù)據(jù)類型轉(zhuǎn)化為對象
Integer i=100;
//等價于Integer num = Integer.valueOf(100);
- 自動拆箱
將對象轉(zhuǎn)化為基本數(shù)據(jù)類型
Integer i = 100;/ /聲明一個Integer對象
i++;// 進行計算時自動拆箱