回答重點
Java的Integer緩存池(Integer Cache)是為了提升性能和節省內存。根據實踐發現大部分的數據操作都集中在值比較小的范圍,因此緩存這些對象可以減少內存分配和垃圾回收的負擔,提升性能
在 -128到127范圍內的Integer對象會被緩存和復用
原理:
- Java在自動裝箱時,對于值范圍在-128 - 127之中的int類型,會直接返回一個已經緩存的Integer對象,而不是創建新的對象
緩存池的使用場景:
- 自動裝箱(Auto-boxing):當基本類型int轉換為包裝類Integer時,若數值在緩存范圍內,返回緩存對象,而不是創建新對象
- 值比較:由于相同范圍內的整數使用同一個緩存對象,使用==可以正確比較它們的地址(引用相同),而不需要使用equals()。但是要注意對于超過緩存范圍的Integer對象,==比較的是兩個不同的對象地址。
擴展知識
緩存池的可配置范圍
在Java8及以后的版本中,可以通過JVM參數 -XX:AutoBoxCacheMax=size 來調整緩存池的上限
比如:
java -XX:AutoBoxCacheMax=500
這樣可以將緩存范圍擴展到-128 - 500
緩存池實現原理分析
實現的原理是int在自動裝箱的時候會調用Integer.valueOf(),進而用到了IntegerCache。
IntegerCache的底層實現,就是判斷下值是否在范圍之內,如果是的話去IntegerCache中取
IntegerCache在靜態塊中會初始化好緩存值
不僅Integer有緩存池,Long也是有的,不過范圍是寫死的 -128 到 127(無法配置)
- Long、Short、Byte這三種包裝類緩存范圍也是-128到127的
- Float和Double沒有緩存池,因為是小數,能存的數太多了
- Character緩存范圍是\u0000到\u007F(即0到127,代表ASCII字符集)
- Boolean只緩存兩個值,即true和false