好程式設計師Java培訓分享int和Integer的區別

好程式設計師發表於2020-08-05

   好程式設計師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

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

2

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

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

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

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

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

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

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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2709461/,如需轉載,請註明出處,否則將追究法律責任。

相關文章