Integer 這個型別你真的瞭解嗎?

Java中基本資料型別和包裝類

Integer 這個型別你真的瞭解嗎?

這張圖相信大家在初學Java的時候都應該記得很熟了,包括jdk1。5之後引入的裝箱和拆箱那就更沒有什麼問題了,大家都知道Java是面向物件的,而基本型別資料不帶有其他資訊或者可操作方法。這在實際使用中存在很多不足,為了解決這個不足而引入了引用型別。

問題描述

Integer 這個型別你真的瞭解嗎?

問題其實很簡單,但是一不小心就可能被誤導了,我們還是先說答案:

var1 == var2 的結果是true;

var3 == var4 的結果是false;

結果分析

Integer var1 = 127;

這裡其實有一個從基礎型別到包裝型別的轉換過程,從Integer這個類中我們可以找到答案

Integer 這個型別你真的瞭解嗎?

我特意把註釋也截出來了,他的大概意思是:如果不需要新的例項時,應優先使用該方法的建構函式,因為他會先去請求快取,快取的範圍是-127~128。

細心的小夥伴應該能猜到上面的答案為什麼一個是true而另一個是false了,如果你還沒搞明白的話那接著往下看:

Integer 這個型別你真的瞭解嗎?

IntegerCache初始化的時候cache快取是一個放Integer型別的陣列,並且將-128~127包裝成256個物件存入快取,-128~127區間的int值有其對應的的包裝物件,這樣在呼叫valueOf方法的時候就會先去cache中去找,找不到的話才會去建立物件。

總結:

先去快取中找,如果在-128~127這個範圍的話就返回,否則就在堆記憶體中建立。而cache區間的值在初始化的時候就已經存在的,所以==的值為true,而128是堆記憶體中建立的但是地址不同所以==結果為false。

擴充套件:

Integer 這個型別你真的瞭解嗎?

同樣的問題在阿里巴巴的開發手冊中也找到了答案,個人感覺阿里的手冊寫的挺好的,我相信如果你仔細看幾遍的話會對你的程式碼能力有很大的提升。

寫在最後

本來是想把這個阿里的開發手冊分享給大家的,但是這裡沒看到有上傳檔案的地方,大家有想要的私信我。最後請各位路過的同仁幫忙點個贊吧!