02 java包裝類型的快取機制
02 java包裝類型的快取機制
- Java 基本數據類型的包裝類型的大部分都用到了快取機制來提升性能。
Byte
,Short
,Integer
,Long
這 4 種包裝類默認創建了數值 [-128,127] 的相應類型的快取數據,Character
創建了數值在 [0,127] 範圍的快取數據,Boolean
直接返回True
orFalse
。
下面讓我們來探究源碼吧!
Integer源碼
可以看到 當我們需要轉換的值在 -128>=x<=127 這個區間 會採用堆中的引用 不信看看下面的測試
測試
可以看到 倆個對象在jvm中的記憶體地址是一樣的 從來說明 使用的是快取數據
Boolean源碼
跟Integer同樣的方式進入
- 可以看到 使用的是三元運算符的方式 TRUE和FALSE都是靜態常量
static變數修飾變數:
在記憶體中只有一份,相同類的不同實例都指向同一份記憶體。
如果超出對應範圍仍然會去創建新的對象,快取的範圍區間的大小只是在性能和資源之間的權衡。
兩種浮點數類型的包裝類 Float
,Double
並沒有實現快取機制。
下面我們來看一下問題。下面的程式碼的輸出結果是 true
還是 false
呢?
Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);
Integer i1=40
這一行程式碼會發生裝箱,也就是說這行程式碼等價於Integer i1=Integer.valueOf(40)
。因此,i1
直接使用的是快取中的對象。而Integer i2 = new Integer(40)
會直接創建新的對象。因此,答案是
false
。你答對了嗎?
記住:所有整型包裝類對象之間值的比較,全部使用 equals 方法比較什麼是裝箱拆箱