自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)

JDK1.5提供了自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)功能。
所谓自动装箱,就是可以把一个基本类型变量直接赋给对应的包装类变量,或者赋给Object变量(Object类是所有类的父类,子类对象可以直接赋给父类变量);
自动拆箱则与之相反,允许直接把包装类对象直接赋给一个对应的基本类型变量。

————————————————————————————————————————————————————————————————
程序示例:自动装箱,自动拆箱

public class AutoBoxingUnboxing

{
    public static void main(String[] args)
    {
        //直接把一个基本类型变量赋给Integer变量
        Integer  inObj = 5;
        //直接把一个boolean变量赋给一个Object对象
        Object boolObj = true;
        //直接把一个Integer对象赋给int 类型变量
        int  it = inObj;
        if(boolObj  instanceof  Boolean){
        //先把Object对象强制转换成Boolean类型,再赋给boolean变量
        boolean b =(Boolean)boolObj;
        System.out.println(b);
        }

    }
}

注意:

(1)进行自动装箱和自动拆箱必须注意类型匹配。例如,Integer只能自动拆箱成int变量类型;int类型变量也只能自动装箱成Integer对象(即使赋给Object类型变量,也只是利用了java的向上自动转型特性)

(2)包装类还可以实现基本类型变量和字符串之间的转换,把字符串类型的值转换成基本类型的值有两种方式:
1.利用包装类提供的parseXxx(String s)静态方法(除了Character之外的所有包装类都提供了该方法)
2.利用包装类提供的Xxx(String s)构造器。
(3)String 类提供了多个重载value()方法,用于将基本类型转换成字符串:
————————————————————————————————————————————————————————

JDK1.5以后支持自动装箱,自动装箱就是把一个基本类型值赋给一个包装类实例。但有可能会出现一些特殊的情况:

//通过自动装箱,允许将基本类型值赋给包装类实例:
Integer ina = 2;
Integer inb = 2;

System.out.println(“两个2自动装箱后是否相等”+(ina == inb));//输出true

Integer biga = 128;
Integer bigb =128;
System.out.println(“两个128自动装箱后是否相等”+(biga == bigb));//输出false

//什么原因呢?
看java.lang.Integer类的源代码:

static final Integer [] cache = new Integer[-[-128]+127+1];//定义一个长256数组
static{
//执行初始化,创建一个-128到127的Integer实例,并放入cache数组中
for(int i = 0;i<cache.length;i++)
    {
    cache[i]=new Integer(i-128);

}

}
//可以看出,系统把一个-128到127之间的整数自动装箱成Integer实例,并放入cache数组中缓存起来。因此-128到127之间的同一个整数自动装箱成Integer实例时,永远都是引用cache数组的同一个数组元素,所以他们全部相等;但每一次把一个不在-128到127范围内的整数自动装箱成Integer实例时,系统总是重新创建一个Integer实例。

java对这些数据进行缓存的原因:
缓存是一种非常优秀的设计模式,java把一些创建成本大,需要频繁使用的对象缓存起来,从而提高程序的运行性能。
————————————————————————————————————————————————
java7为所有的包装类都提供了一个静态的 compare(xxx val1,xxx val2 )方法,这样就可以比较两个基本类型值的大小,包括比较两个boolean类型值。(true>false)
System.out.println(Boolean.compare(true,false)); //输出1
System.out.println(Boolean.compare(true,true)); //输出0
System.out.println(Boolean.compare(false,true)); //输出-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值