int → Integer),編譯器調用 Integer.valueOf(int)Integer → int),編譯器調用 Integer.intValue()Integer a = 100; // 自動裝箱:Integer.valueOf(100) int b = new Integer(100); // 自動拆箱:new Integer(100).intValue()
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // 緩存範圍 [-128, 127]
return IntegerCache.cache[i + offset]; // 返回緩存對象
}
return new Integer(i); // 範圍外新建對象
}
public void m11() {
Integer a = new Integer(100);
Integer b = 100; // 自動裝箱
System.out.println(a == b); // false
}
public void m12() {
Integer a = new Integer(128);
Integer b = 128;
System.out.println(a == b); // false
}
結果:均為 false。new 總創建新對象,valueOf 可能走緩存,但兩者引用不同。
public void m21() {
Integer a = new Integer(100);
Integer b = new Integer(100);
System.out.println(a == b); // false
}
結果:false。兩次 new 創建不同對象。
public void m31() {
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true!
}
public void m32() {
Integer a = 128;
Integer b = 128;
System.out.println(a == b); // false
}
結果:100 → true,128 → false。
原因:均調用 valueOf。100 在緩存範圍內,返回同一緩存對象;128 超出範圍,各自新建對象。
public void m41() {
Integer a = Integer.valueOf(100);
Integer b = 100;
System.out.println(a == b); // true
}
public void m42() {
Integer a = Integer.valueOf(128);
Integer b = 128;
System.out.println(a == b); // false
}
結果同案例 3。字節碼證實自動裝箱本質就是調用 valueOf。
// m31: Integer a = 100; Integer b = 100; 0: bipush 100 2: invokestatic Integer.valueOf:(I)Ljava/lang/Integer; // a 5: astore_1 6: bipush 100 8: invokestatic Integer.valueOf:(I)Ljava/lang/Integer; // b 11: astore_2 // 兩次調用 valueOf,100 走緩存,返回同一對象 // m32: Integer a = 128; Integer b = 128; 0: sipush 128 3: invokestatic Integer.valueOf:(I)Ljava/lang/Integer; // a 6: astore_1 7: sipush 128 10: invokestatic Integer.valueOf:(I)Ljava/lang/Integer; // b 13: astore_2 // 128 超出緩存,各自 new Integer(128)
| 包裝類 | 緩存範圍 |
|---|---|
| Integer | -128 ~ 127 |
| Short | -128 ~ 127 |
| Byte | -128 ~ 127 (全範圍) |
| Long | -128 ~ 127 |
| Character | 0 ~ 127 |
| Boolean | true/false 兩個單例 |
| Float/Double | 無緩存 |
.equals(),== 比較引用地址Long sum = 0L; for(...) sum += i; 每次循環裝箱拆箱,改用基本類型 long sum = 0L;ResultSet.getObject() 返回包裝類裝箱拆箱是 Java 語法糖,Integer.valueOf() 緩存機制是面試高頻考點。記住: