java裏面int和Integer的區別,十個人有九個答不上來

2019年10月07日12:50:09 科技 1907

在說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

來看個例子

java裏面int和Integer的區別,十個人有九個答不上來 - 天天要聞

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方法如下

java裏面int和Integer的區別,十個人有九個答不上來 - 天天要聞

4:c == e 嗎, i == j 嗎?

答案都是相等的。因為封裝類和基本數據類型進行比較的時候,java會自動拆箱,然後比較數值是 否相等。

綜上,我們可以得出幾個結論:

1、都是封裝類,都是new出來的,肯定不相等。因為對象的內存地址不一樣。

2、都是封裝類,都不是new出來的,如果值在-128~127之間,那就相等,否則不相等。

3、如果是封裝類和基本類型進行比較,只要數值相等那就相等,否則就不相等。因為封裝類和基本數據類型進行比較的時候會有一個自動拆箱操作。

4、都是基本數據類型,如果數值相等,那就相等;否則不相等。


新課29.9元限時優惠至10元

科技分類資訊推薦

引領科技豪華MPV新風尚 第二代騰勢D9西安車展亮相 - 天天要聞

引領科技豪華MPV新風尚 第二代騰勢D9西安車展亮相

兼具宜商氣度與家用溫情的科技豪華旗艦MPV,第二代騰勢D9迎來西安地區正式亮相。新車依託全球新能源MPV冠軍底蘊,以第二代刀片電池、雙閥雲輦-C、天神之眼5.0智駕等核心技術全面升級,兼顧商務體面與家庭舒適,為西北高端用戶帶來一站式全能出行解決方案。
採購禁入!科華數據材料造假被拒門外 - 天天要聞

採購禁入!科華數據材料造假被拒門外

本報(chinatimes.net.cn)記者胡雅文 北京報道這家趕上AI算力風口的公司,因投標材料造假,被相關採購方列入禁入名單兩年,其此前提出的複議申請也被正式駁回。相關採購平台近日發佈公告,明確駁回科華數據股份有限公司(下稱「科華數據」,002335.SZ)此前提交的複議申請。早在一年前,科華數據已被認定在「信息通信樞紐...
快評樂道L80:15萬元級買大五座,這波值得沖? - 天天要聞

快評樂道L80:15萬元級買大五座,這波值得沖?

日前,樂道L80正式發佈並開啟預售,其整車購買預售價為24.58萬元起,租電購買預售價則低至15.98萬元起。面對大型SUV市場「細分再細分」之競爭趨勢,這款樂道年度重磅新車都有哪些優勢?又能否成為「大五座SUV革新之作」?下面,圈哥就帶大家全方位感受。
成都直擊凱威德:純電全尺寸SUV的張揚與大氣 - 天天要聞

成都直擊凱威德:純電全尺寸SUV的張揚與大氣

4月22日,凱迪拉克以奧斯卡級盛典規格,將上海保利大劇院點亮為璀璨舞台,在品牌代言人倪妮與全場嘉賓的共同見證下,凱迪拉克全尺寸純電公路旗艦——凱威德耀然上市。新車共推出長續航四驅Pro、高性能四驅Ultra兩款配置,官方售價區間為46.88萬-50.88萬元。