一、概念
Java有8种基本数据类型,对应着8种包装类。分别是:
整数型:byte, short, int, long -> Integer, Short, Integer, Long
小数型:float, double -> Float, Double
字符型:char -> Character
布尔型:boolean -> Boolean
包装类的出现是为了完善Java中“一切皆对象”的概念。
注意:包装类的比较与对象相同,==比较的内在地址,.equals()比较的才是值。
二、自动装箱与拆箱
自动装箱就是自动把原始数据类型转换为包装类型,自动拆箱就是自动把包装类型转换为基本类型。本质上装箱是调用包装类的.valueOf()方法,拆箱是调用包装类的.xxxValue()方法。
三、包装类的缓存机制
所有整数型的包装类都在[-128, 127]之间做了缓存,即预先生成了这区间内的整数型对象。Character生成了[0, 127]区间内的字符型对象,Boolean生成成TRUE, FALSE两个布尔型对象。注意,上述的缓存机制只在被调用valueOf()方法时才会启用,也就是说用new关键字会创造成新的对象。此外浮点型没有缓存机制。因此会呈现出下面的有趣现象:
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
Integer i5 = new Integer(100);
System.out.println(i1 == i2);
System.out.println(i3 == i4);
System.out.println(i1 == i5);
// true false false
解释:由于i1, i2会触发缓存机制,所以i1与i2相等, i3, i4不在缓存机制范围内,所以不等。而i5是用new关键字创建的新对象,自然也不相等。