java 5开始引入了autoboxing 和auto-unboxing机制,方便了基本类型和其对应的wrapper类型的转换。比如我们可以直接把一个基本类型的值赋给其wrapper类型,反之亦然;可以把一个基本类型直接放入容器里,封装的过程由编译器来完成;调用方法的时候可以直接匹配参数autoboxing和auto-unboxing之后的版本。
这个过程编译器也只是做了个简单的处理,通过wrapper class的valueOf()方法对基本类型进行包装,通过wrapper class 的"基本类型名称"+Value() 方法得到其基本类型。
比如
Integer i=5;
int ii=i;
编译器将其变换为:
Integer i=Integer.valueOf(5);
int ii=i.intValue();
对于其他基本类型是一致的,不过auto-unboxing使用的方法名要根据类型变换,比如boolean类型的Boolean.booleanValue(),byte的Byte.byteValue()等等。
autoboxing的时候为什么使用valueOf() 方法而不使用new 来创建呢?
看文档的解释:
Integer的valueOf()方法:因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。
注意两点:
1.重点:缓存!(设计模式中的享元模式)
Boolean类型中直接缓存了两个Boolean对象,TRUE和FALSE,这样使用valueOf()方法时只需要直接返回这两个对象中的一个,而不是每次调用的时候都用new,这也就是文档里所说的通过缓存经常请求的值二显著提高空间和时间性能。
Byte,Integer 和Long都是缓存了-128~+127之间的对象,autoboxing的时候,如果需要boxing的值在此范围之内,则直接返回缓存的对象,没有的时候再去new.
Character因为类型的特殊性,保存的是0-127之间的对象。
举个实际的例子,这是Integer中的实现:
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)