什么是包装类
Java是一个面向对象的编程语言,但是Java中的八种基本数据类型却是不面向对象的,为了使用方便和解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八种基本数据类型对应的类统称为包装类(Wrapper Class),包装类均位于java.lang包。
八种基本数据类型与包装类的对应关系
基本数据类型 | 包装类 |
---|---|
byte | java.lang.Byte |
short | java.lang.Short |
int | java.lang.Integer |
long | java.lang.Long |
float | java.lang.Float |
double | java.lang.Double |
boolean | java.lang.Boolean |
char | java.lang.Character |
基本数据类型与其对应包装类的区别
-
数据类型不同
一个是基本数据类型,一个是引用数据类型
-
存储位置不同
基本数据类型直接将数据保存在栈中,包装类直接将数据保存在堆中
-
null的处理不同
基本数据类型不能赋空值,包装类可以赋空值
-
初始值不同
在基本数据类型中,整数类型的初始值是0,小数类型的初始值是0.1,boolean类型的初始值是false,char类型的初始值是’’(空字符)
在包装类中,所有类型的初始值都为null
给包装类赋值的方式
// 方式一
Integer integer1 = new Integer(10);
// 方式二
Integer integer2 = Integer.valueOf(10);
// 方式三
Integer integer3 = 10;
装箱与拆箱
装箱:指将基本数据类型转换为包装类对象
拆箱:指将包装类对象转换为基本数据类型
// 手动装箱
Integer integer = Integer.valueOf(10);
// 手动拆箱
int i = integer.intValue();
// 自动装箱(等同于Integer.valueOf(10))
Integer integer = 10;
// 自动拆箱(等同于integer.intValue())
int i = integer;
包装类的缓存问题
示例一
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1 == integer2);
运行结果
false
Process finished with exit code 0
这个很容易解释,integer1 和 integer2 是两个不同的示例,比较地址自然是不相等。
示例二
Integer integer3 = Integer.valueOf(127);
Integer integer4 = Integer.valueOf(127);
System.out.println(integer3 == integer4);
运行结果
true
Process finished with exit code 0
这是为什么呢???
查看源码后发现,原来当数值大于等于IntegerCache.low和小于等于IntegerCache.high时是从缓存数组中取得值;
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

那么IntegerCache.low和IntegerCache.high是多少?缓存数组又在哪里初始化的呢?
private static class IntegerCache {
// IntegerCache.low的值
static final int low = -128;
static final int high;
static final Integer cache[];
static {
int h = 127;
String integerCacheHighPropValue =
VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
}
}
// IntegerCache.high的值为h=127
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
// 给缓存数组赋值
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
可用一段代码来简单验证
Integer integer3 = Integer.valueOf(127);
Integer integer4 = Integer.valueOf(127);
System.out.println(integer3 == integer4);
Integer integer5 = Integer.valueOf(128);
Integer integer6 = Integer.valueOf(128);
System.out.println(integer5 == integer6);
Integer integer7 = Integer.valueOf(-128);
Integer integer8 = Integer.valueOf(-128);
System.out.println(integer7 == integer8);
Integer integer9 = Integer.valueOf(-129);
Integer integer10 = Integer.valueOf(-129);
System.out.println(integer9 == integer10);
运行结果
true
false
true
false
Process finished with exit code 0