好程式設計師Java培訓分享int和Integer的區別
好程式設計師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 、都是基本資料型別,如果數值相等,那就相等;否則不相等。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2709461/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java培訓分享Java和HTML的區別?程式設計師JavaHTML
- 好程式設計師Java培訓分享treeset和hashset的區別程式設計師Java
- 好程式設計師Java培訓分享Java EE與Java的區別程式設計師Java
- 好程式設計師Java培訓分享之RMI與RPC的區別程式設計師JavaRPC
- 好程式設計師Java培訓分享Java程式設計技巧程式設計師Java
- 好程式設計師Python培訓分享print和return的作用及區別程式設計師Python
- 好程式設計師Java培訓分享BigDecimal的用法程式設計師JavaDecimal
- 好程式設計師Java培訓分享SpringBoot -YAML程式設計師JavaSpring BootYAML
- 好程式設計師Java培訓分享Java程式設計師技能提升指南程式設計師Java
- 好程式設計師Java培訓分享Java程式設計師常用的工具類庫程式設計師Java
- 好程式設計師Java培訓分享Spring Ioc的原理程式設計師JavaSpring
- 好程式設計師Java培訓分享maven-概述程式設計師JavaMaven
- 好程式設計師Java培訓分享如何快速入門Java程式設計程式設計師Java
- 好程式設計師Java培訓分享20個Java程式設計師基礎題程式設計師Java
- 好程式設計師Java培訓分享Java之反射技術程式設計師Java反射
- 好程式設計師Java培訓分享如何快速入門Java程式設計師Java
- 好程式設計師Java培訓分享Java包是什麼?程式設計師Java
- 好程式設計師Java培訓分享Java多執行緒程式設計師Java執行緒
- 好程式設計師Java培訓分享本地快取如何設計程式設計師Java快取
- 好程式設計師Java培訓分享SpringBoot -啟動流程程式設計師JavaSpring Boot
- 好程式設計師Java培訓分享For迴圈詳解程式設計師Java
- 好程式設計師Java培訓分享SpringBoot入門篇程式設計師JavaSpring Boot
- 好程式設計師Java培訓分享學Java程式設計要注意什麼程式設計師Java
- int和Integer的區別
- 好程式設計師Java培訓分享面試Java的注意事項程式設計師Java面試
- 好程式設計師Java培訓分享Java集合的兩種排序方法程式設計師Java排序
- 好程式設計師Java培訓分享Java物件導向概念解析程式設計師Java物件
- 好程式設計師Java培訓分享Java初學者必讀程式設計師Java
- 好程式設計師Java培訓分享MySQL算術運算子程式設計師JavaMySql
- 好程式設計師Java培訓分享SpringBoot -自動配置原理程式設計師JavaSpring Boot
- 好程式設計師Java培訓分享Mybatis面試題集合程式設計師JavaMyBatis面試題
- 好程式設計師ava培訓分享void的用法和意義程式設計師
- 好程式設計師Java培訓分享Java類載入的過程概述程式設計師Java
- 好程式設計師Java培訓分享Java的三大框架怎麼學?程式設計師Java框架
- 好程式設計師Java培訓分享Java面試題集合篇一程式設計師Java面試題
- 好程式設計師Java培訓分享Java面試題集合篇二程式設計師Java面試題
- 好程式設計師Java培訓分享學習Java需要哪些基礎程式設計師Java
- 好程式設計師Java培訓分享Java中級面試題合集程式設計師Java面試題