背景
面試題, 相關問題的考察.
題目大概是, 包裝類型Integer == 比較的時候 : -127 ~ 128 是否相等.
其他是否相等?
原理
== 比較的是地址. 如果是不同的對象, 那么就不相等.
實踐
下面是幾個簡單實踐.
全部新建對象
解釋: 新建對象后, 地址不同, 所以都是false
不新建對象
暫時的理解: -127 ~ 128 比較的對象的緩存
一些思考
時間多, 一些靈感
為什么設計這個緩存
HotSpot 團隊研究, 90% 以上的整型使用落在 -128~127范圍內(2000年代初期數據).
緩存范圍 -128~127共 256 個對象 ≈ 4KB 內存(每個 Integer對象約16B)
為什么不多緩存一點
擴大到 -256~255則需 512 對象 ≈ 8KB,收益遞減
冷知識: 上限值可以調整
部分源碼如下:
// IntegerCache 源碼片段(OpenJDK 17)
private static class IntegerCache {static final int low = -128; // 硬編碼下限static final int high;static {high = java.lang.Integer.getInteger("java.lang.Integer.IntegerCache.high", 127);// 上限可通過VM參數調整}
}
為什么下限值不能自定義呢?
防止濫用:若允許下限調至 -1,000,000,可能導致緩存占用數百MB內存
其實其他包裝類型也有緩存
緩存范圍如下:
類 | 緩存范圍 | 可調性 |
---|---|---|
Integer | -128~127 | 僅上限可調 |
Long | -128~127 | 完全不可調 |
Short | -128~127 | 完全不可調 |
Character | 0~127(ASCII范圍) | 完全不可調 |
這個居然也是API?
Integer b = new Integer(100); // ?? 已棄用API
9版本被棄用了: 神奇!
/*** @deprecated* It is rarely appropriate to use this constructor. * Use {@link #valueOf(int)} to take advantage of caching.*/
@Deprecated(since="9")
public Integer(int value) {this.value = value;
}
設計思想
這種設計體現了 Java “80/20法則” 的工程哲學——用最小成本解決大多數問題。