所谓自动装箱,就是把基本数据类型用他们对应的引用类型包装起来,使他们可以具有对象的特质。例如我们可以把int类型包装成Integer类型的,把double类型的包装成Double类型的。
所谓拆箱,就是进行与自动装箱相反的操作。
自动装箱的过程:当需要一种类型的对象时,这种基本数据类型就自动封装到与它对应的包装类中。
自动拆箱的过程:当需要一个数值时,被装箱的对象中的值就会被自动提取出来,没有必要再去调用intValue()和doubleValue()等方法。
public static void main(String[] args) {
Integer a = 100;
Integer b = 100;
Integer c = 200;
Integer d = 200;
//因为进行了自动拆箱,比较的是基本数据类型,因此"=="比较的是其数值,结果数true。
//当Integer类型后面赋值范围在-128---127之间时,都会返回true,否则返回false。
System.out.println(a == b);//true
System.out.println(a == 100);//true
//事实上,java为了提高效率,IntegerCache类中有一个数组缓存了值从-128到127的Integer对象。
// 当我们调用Integer.valueOf(int i)的时候,如果i的值是>=-128且<=127时,
// 会直接从这个缓存中返回一个对象,否则就new一个Integer对象。
System.out.println(c == d);//false
System.out.println(c == 200);//true
}
java为了提高效率,IntegerCache类中有一个数组缓存了值从-128到127的Integer对象,实际上采用了享元模式,什么事享元模式呢? 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}