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