包装类
- 包装类的分类
java中8种基本类型的引用类型–包装类
基本数据类型 | 包装类 |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
其中,Byte、Short、Integer、Long、Float、Double都继承Number父类
- 包装类和基本数据转换
- jdk5以前手动装箱和拆箱方式。装箱:基本类型->包装类型;拆箱:包装类型->基本类型
- jdk5以后是自动装箱和拆箱
- 自动装箱的底层调用的是valueOf方法,例如Integer.valueOf()
- 自动拆箱的底层调用的是intValue()方法
注意点:
在Integer的包装类中,存在一个缓存数组static final Integer cache[]; Integer缓存预先创建并存储了值在-128
到127
之间的Integer对象,如果是通过valueOf方法的值会先充这个缓存数组中获取(该配置可以修改),如果不在该区间内,则是调用的new Integer()重新创建一个新的Integer对象。其实不仅仅在应用在Integer包装类对象,Byte、Short、Long、Character对象也存在类似的缓存。
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) {
try {
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);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}