IntegerCache的妙用和陷阱
考慮下面的小程式,你認為會輸出為什麼結果?
public class Test {
public static void main(String[] args) {
Integer n1 = 123;
Integer n2 = 123;
Integer n3 = 128;
Integer n4 = 128;
System.out.println(n1 == n2);
System.out.println(n3 == n4);
}
}
答案如下,請選擇刮開:
true
fase
是否和你預想的一致?
我們知道==比較的是物件的引用,那這裡為什麼會這出這種情況呢?
原理
首先這是JDK在1.5版本中新增的一項新特性,把-128~127的數字快取起來了,用於提升效能和節省記憶體。所以這個範圍內的自動裝箱(相當於呼叫valueOf(int i)方法)的數字都會從快取中獲取,返回同一個數字,所以現在你理解為什麼了吧。同時這也會給我們開發帶來預想不到的陷阱,直得注意!!
而我們通過new Integer(1)這樣就不會從快取中獲取,大家可以自行測試。
我們來翻看下jdk中Integer的原始碼
上面是IntegerCache的原始碼,把從-128~high放在快取中
上面是valueOf的原始碼,先從快取中獲取,獲取不到再new一個返回
從原始碼裡面我們可以看到最小邊界是-128,最大邊界可以通過-XX:AutoBoxCacheMax進行配置,但也不會大於Integer.MAX_VALUE最大值。
相關文章
- IntegerCache
- Go slice切片的“陷阱”和本質Go
- ActionChains 的妙用AI
- reduce的妙用
- CSS Grid中的陷阱和絆腳石CSS
- Go channel 的妙用Go
- c的陷阱
- 二分的妙用
- html <a>標籤的妙用HTML
- Linux:“awk”命令的妙用Linux
- 妙用ConstraintLayout的Circular positioningAI
- MacBook上的touchid妙用Mac
- js中的Boolean 的妙用JSBoolean
- git 妙用Git
- setTimeout妙用
- 聰明的陷阱
- Go sync.Once 的妙用Go
- C++中const的妙用C++
- typescript:never與keyof的妙用TypeScript
- KeyPath在Swift中的妙用Swift
- Javascript裝飾器的妙用JavaScript
- combineLatest 使用的一個陷阱和基於 debounceTime 的解決方案
- python關於+=的陷阱Python
- WebRTC 的三個“陷阱”Web
- 使用Python和Java呼叫Shell指令碼時的死鎖陷阱PythonJava指令碼
- CSS中content屬性的妙用CSS
- git rebase --onto 的奇妙用法Git
- vue-router中scrollBehavior的妙用Vue
- foreach陷阱
- ORM 陷阱ORM
- [20191216]route妙用.txt
- Flink狀態妙用
- hr標籤妙用
- 訓練生成對抗網路的一些技巧和陷阱
- Java 中比較 BigDecimal 的陷阱JavaDecimal
- 多元泰勒展開的陷阱
- 上傳檔案的陷阱
- Python字典遍歷的陷阱Python