2020-08-05
Java培訓(xùn)
好程序員Java培訓(xùn)分享int和Integer的區(qū)別,在說(shuō)int和Integer的區(qū)別之前,先要弄清楚兩個(gè)問(wèn)題:
一、Java基本數(shù)據(jù)類(lèi)型及其封裝類(lèi)
二、Java自動(dòng)拆箱和自動(dòng)裝箱
Java自動(dòng)拆箱和自動(dòng)裝箱
1、自動(dòng)裝箱
自動(dòng)裝箱其實(shí)就是將基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換為引用數(shù)據(jù)類(lèi)型(對(duì)象)
2、自動(dòng)拆箱
自動(dòng)拆箱其實(shí)就是將引用數(shù)據(jù)類(lèi)型轉(zhuǎn)化為基本數(shù)據(jù)類(lèi)型
int 和 Integer的區(qū)別
分析
int
Integer
int 與 Integer 的區(qū)別
相同值下的 int 和 Integer 的比較結(jié)果
分析
int
int 是Java的基本數(shù)據(jù)類(lèi)型。
Integer
Integer 繼承了Object類(lèi),是對(duì)象類(lèi)型,是 int 的包裝類(lèi)。
int 與 Integer 的區(qū)別
值的存儲(chǔ)
int 存儲(chǔ)在棧中
Integer 對(duì)象的引用存儲(chǔ)在棧空間中,對(duì)象的數(shù)據(jù)存儲(chǔ)在堆空間中。
初始化
int 初始化值為0。
Integer 初始化值為null。
傳參
int 是值傳遞,棧中的數(shù)據(jù)不可變。
Integer 對(duì)象是引用傳遞,引用不可變,但是引用指向的堆空間地址中的值是可以改變的。
泛型支持
泛型不支持int,但是支持Integer。
運(yùn)算
int 可以直接做運(yùn)算,是類(lèi)的特性。
Integer 的對(duì)象可以調(diào)用該類(lèi)的方法,但是在拆箱之前不能進(jìn)行運(yùn)算,需要轉(zhuǎn)化為基本類(lèi)型int。
int是基本數(shù)據(jù)類(lèi)型,Integer是引用數(shù)據(jù)類(lèi)型;
int默認(rèn)值是0,Integer默認(rèn)值是null;
int類(lèi)型直接存儲(chǔ)數(shù)值,Integer需要實(shí)例化對(duì)象,指向?qū)ο蟮牡刂贰?/font>
相同值下的 int 和 Integer 的比較結(jié)果
兩個(gè)通過(guò)new生成的變量,結(jié)果為false。
int 和 Integer 的值比較,若兩者的值相等,則為true。
(注意:在比較時(shí),Integer會(huì)自動(dòng)拆箱為int類(lèi)型,然后再做比較。)
new 生成的Integer變量 和 非new 生成的Integer變量比較,,結(jié)果為false。
(注意:new 生成的Integer變量的值在堆空間中,非new 生成的Integer變量的值在在常量池中。)
(注意:非new生成的Integer變量,會(huì)先判斷常量池中是否有該對(duì)象,若有則共享,若無(wú)則在常量池中放入該對(duì)象;也叫享元模式,后面再說(shuō)。)
兩個(gè)非new 生成的Integer對(duì)象比較,則結(jié)果為true。
(注意:此處需要一個(gè)前提:值的范圍在 -128 ~ 127 之間。
涉及到Java對(duì) int 與 Integer 的自動(dòng)裝箱和拆箱的一種模式:享元模式—flyweight,為了加強(qiáng)對(duì)簡(jiǎn)單數(shù)字的重復(fù)利用。
在賦值時(shí),其實(shí)是執(zhí)行了Integer的valueOf()方法。
當(dāng)值在 -128 ~ 127之間時(shí),Java會(huì)進(jìn)行自動(dòng)裝箱,然后會(huì)對(duì)值進(jìn)行緩存,如果下次再有相同的值,會(huì)直接在緩存中取出使用。緩存是通過(guò)Integer的內(nèi)部類(lèi)IntegerCache來(lái)完成的。
當(dāng)值超出此范圍,會(huì)在堆中new出一個(gè)對(duì)象來(lái)存儲(chǔ)。
PS:自動(dòng)裝箱與拆箱是在JDK1.5中出現(xiàn)的。
)
內(nèi)部類(lèi)IntegerCache
通過(guò)此類(lèi)可以緩存簡(jiǎn)單數(shù)字。
緩存的數(shù)大小可以由 -XX:AutoBoxCacheMax = 控制。
jvm初始化時(shí),Java.lang.Integer.IntegerCache.high屬性可以設(shè)置并保存在私有系統(tǒng)屬性中。
規(guī)定了low屬性的值:-128
來(lái)看個(gè)例子
1:a == b 嗎? 廢話,肯定不相等。兩個(gè)new出來(lái)的對(duì)象地址不一樣。
2:c == d 嗎? 這個(gè)也是廢話,都是基本數(shù)據(jù)類(lèi)型的值肯定相等。
3:現(xiàn)在的關(guān)鍵問(wèn)題是 e == f 嗎? g == h 嗎?
答案是:e == f; g != h。為什么會(huì)出現(xiàn)這種情況?因?yàn)?/font>ava在進(jìn)行編譯時(shí) Integer g = 130會(huì)被編譯成 Integer.valueOf(130) ,這個(gè)可以通過(guò)反編譯class文件看到。而通過(guò)Integer源碼可以得出,Integer.valueOf() 方法會(huì)在數(shù)值-128~127之間會(huì)對(duì)Integer進(jìn)行緩存,不會(huì)再重新new一個(gè),所以 e==f ;當(dāng)數(shù)值二大于127或者小于-128的時(shí)候則會(huì)重新new一個(gè),所以g != h 。
Integer的valueOf方法如下
4:c == e 嗎, i == j 嗎?
答案都是相等的。因?yàn)榉庋b類(lèi)和基本數(shù)據(jù)類(lèi)型進(jìn)行比較的時(shí)候,Java會(huì)自動(dòng)拆箱,然后比較數(shù)值是 否相等。
綜上,我們可以得出幾個(gè)結(jié)論:
1、都是封裝類(lèi),都是new出來(lái)的,肯定不相等。因?yàn)閷?duì)象的內(nèi)存地址不一樣。
2、都是封裝類(lèi),都不是new出來(lái)的,如果值在-128~127之間,那就相等,否則不相等。
3、如果是封裝類(lèi)和基本類(lèi)型進(jìn)行比較,只要數(shù)值相等那就相等,否則就不相等。因?yàn)榉庋b類(lèi)和基本數(shù)據(jù)類(lèi)型進(jìn)行比較的時(shí)候會(huì)有一個(gè)自動(dòng)拆箱操作。
4、都是基本數(shù)據(jù)類(lèi)型,如果數(shù)值相等,那就相等;否則不相等。
開(kāi)班時(shí)間:2021-04-12(深圳)
開(kāi)班盛況開(kāi)班時(shí)間:2021-05-17(北京)
開(kāi)班盛況開(kāi)班時(shí)間:2021-03-22(杭州)
開(kāi)班盛況開(kāi)班時(shí)間:2021-04-26(北京)
開(kāi)班盛況開(kāi)班時(shí)間:2021-05-10(北京)
開(kāi)班盛況開(kāi)班時(shí)間:2021-02-22(北京)
開(kāi)班盛況開(kāi)班時(shí)間:2021-07-12(北京)
預(yù)約報(bào)名開(kāi)班時(shí)間:2020-09-21(上海)
開(kāi)班盛況開(kāi)班時(shí)間:2021-07-12(北京)
預(yù)約報(bào)名開(kāi)班時(shí)間:2019-07-22(北京)
開(kāi)班盛況
Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right
京ICP備12003911號(hào)-5
京公網(wǎng)安備 11010802035720號(hào)