天天看點

int 範圍_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

來看個例子

int 範圍_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方法如下

int 範圍_java裡面int和Integer的差別,十個人有九個答不上來分析

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

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

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

1、都是封裝類,都是new出來的,肯定不相等。因為對象的記憶體位址不一樣。

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

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

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

新課29.9元限時優惠至10元

繼續閱讀