Java为什么要引入自动装箱和拆箱的功能?(为什么)
举个例子:主要是用于java集合中,List<Inteter> list=new ArrayList<Integer>();
list集合如果要放整数的话,只能放对象,不能放基本类型,因此需要将整数自动装箱成对象,基本数据类型,如int,float,double,boolean,char,byte,不具备对象的特征,不能调用方法。
实现原理:javac编译器的语法.
解释:
因为自动装箱,自动调用valueOf方法.
public static Integer valueOf(int i) {//Integer包装类的
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Integer的valueOf方法中一句判断,i >= -128 && i <= IntegerCache.high
如果数值在-128和127之间,就直接调用IntegerCache类,返回缓存中的数据,自然是同一个对象.
否则新建一个Integer对象.
(Double包装类的valueOf方法直接新建一个新对象)
(Boolean包装类valueOf方法,返回 (b ? TRUE : FALSE),)其他的请自行查看,判断.
同时自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值,其实就是自动装箱的相反操作.
4.注意点(弊端):
容易生成无用对象,因为自动装箱会隐式地创建对象,像前面提到的那样,如果在一个循环体中,会创建无用的中间对象,这样会增加GC压力,拉低程序的性能。所以在写循环时一定要注意代码,避免引入不必要的自动装箱操作.