Integer 作為 Java 最常用的包裝類,其內部實現蘊含著許多面試高頻考點與實戰坑點。本文從源碼層面深度解析緩存機制、字符串解析算法、equals 與 == 的行為差異,以及位運算高級方法。
| 方法 | 返回類型 | 適用場景 | 關鍵特性 |
|---|---|---|---|
valueOf(String) | Integer | 十進制字符串轉對象 | 內部調用 parseInt + valueOf(int),利用緩存 |
parseInt(String) | int | 十進制字符串轉基本類型 | 直接返回 int,無裝箱開銷 |
valueOf(String, radix) | Integer | 指定進制字符串轉對象 | 需明確指定基數,不自動識別前綴 |
decode(String) | Integer | 帶前綴字符串(0x, #, 0) | 自動識別進制前綴,返回 Integer 對象 |
getInteger(String, val) | Integer | 獲取系統屬性 | 讀取 System.getProperty,失敗返回默認值 |
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
-Djava.lang.Integer.IntegerCache.high=xxx JVM 參數調整(最大不超過 Integer.MAX_VALUE)IntegerCache 類加載時靜態初始化,填充緩存數組public static int parseInt(String s, int radix) {
// 1. 參數校驗:null、radix 範圍
// 2. 處理符號位:'+'、'-'
// 3. 核心循環:result = result * radix - digit
// 關鍵優化:負向累積避免溢出邊界判斷複雜化
// 4. 最後根據符號返回 result 或 -result
}
算法亮點:使用負向累積(result -= digit),統一處理正負數溢出檢查,limit = -Integer.MAX_VALUE 作為邊界,避免 Integer.MIN_VALUE 絕對值溢出問題。
Integer i1 = 10, i2 = 10, i3 = 128, i4 = 128;
System.out.println(i1 == i2); // true (緩存命中,同一對象)
System.out.println(i1.equals(i2)); // true
System.out.println(i3 == i4); // false (超出緩存,新建對象)
System.out.println(i3.equals(i4)); // true (值比較)
根因:== 比較對象引用(地址),自動裝箱調用 valueOf() 可能返回緩存對象或新對象;equals() 比較內部 int value 字段。
鐵律:包裝類比較值永遠使用 equals(),禁止使用 ==。
sizeTable 快速確定位數,避免循環除法q = i / 100,通過位運算計算餘數),減少除法指令Integer.MIN_VALUE 直接返回常量字符串| 方法 | 功能 | 示例 |
|---|---|---|
highestOneBit(i) | 保留最高位 1,其餘清零 | 1023(1111111111) → 512(1000000000) |
lowestOneBit(i) | 保留最低位 1,其餘清零 | 12(1100) → 4(100) |
numberOfLeadingZeros(i) | 最高位 1 前的 0 個數 | 104(1101000) → 25 |
numberOfTrailingZeros(i) | 最低位 1 後的 0 個數 | 104(1101000) → 3 |
reverse(i) | 二進制位順序反轉 | 7(111) → 11100000000... |
reverseBytes(i) | 字節序反轉 | 0x4835 → 0x35480000 |
rotateLeft/Right(i, dist) | 循環左/右移 | rotateLeft(7,2)=28; rotateLeft(28,-2)=7 |
signum(i) | 符號函數:正→1,零→0,負→-1 | 位運算實現:(i >> 31) | (-i >>> 31) |
valueOf() 利用緩存;parseInt() 避免裝箱;decode();equals();