java 自動裝箱、拆箱
阿新 • • 發佈:2018-06-14
code 題解 解決 ring sun 引用 自動裝箱拆箱 property maximum
# java 自動裝箱、拆箱
從 jdk 1.5
版本開始, 引入該功能。
一、自動裝箱
將基本數據類型自動封裝為對應封裝類。
代碼示例,
Integer i = 100;
100
屬於基本類型int
,會自動裝箱,如下:
Integer i = Integer.valueOf(100);
相當於,
Integer i = new Integer(100);
二、自動拆箱
將封裝類自動轉換為對應的基本數據類型。
代碼示例,
Integer i = new Integer(100);
int j = i;
i
屬於封裝類Integer
,會自動拆箱,如下:
Integer i = new Integer(100); int j = i.intValue();
三、問題
- 三目運算符
問題代碼(會引起NPE
問題),
Map<String, Boolean> map = new HashMap<String, Boolean>();
Boolean b = (map != null ? map.get("test") : false);
問題原因:三目運算符第二、三操作數類型不同(一個為對象,一個為基本數據類型),會將對象自動拆箱為基本數據類型。
拆箱過程,
Map<String, Boolean> map = new HashMap<String, Boolean>(); Boolean b = Boolean.valueOf(map != null ? map.get("test").booleanValue() : false);
問題解決,
Map<String, Boolean> map = new HashMap<String, Boolean>();
Boolean b = (map != null ? map.get("test") : Boolean.FALSE);
- Integer
相關代碼,
Integer int1 = 100; Integer int2 = 100; Integer int3 = 300; Integer int4 = 300; // true System.out.println(int1 == int2); // false System.out.println(int3 == int4);
引起問題原因:裝箱調用了Integer.valueOf()
。源碼如下,
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache
源碼如下,
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}
private IntegerCache() {}
}
未進行特別設置,IntegerCache.high
取值為127
。因此,通過Integer.valueOf()
方法創建Integer
對象的時候,如果數值在[-128,127]
之間,返回IntegerCache.cache
中對象的引用,否則創建一個新的Integer
對象。
java 自動裝箱、拆箱