概念:
装箱:将基本数据类型转换为包装器类型(比如:int 转为Integer 、double 转为Double)
代码:Integer i=new Integer(3);
装箱过程:调用valueof()方法装箱
拆箱:将包装器类型转换为基本数据类型(比如:Integer 转为int 、Double转为double )
代码:int k=i.intValue();
自动装箱与拆箱(Java SE5以后):
在Java SE5 之前要定义一个数值为5的Integer:
Integer in=new Integer(5) (这个是装箱过程,但不是自动装箱)
自动装箱:Integer in=5;
自动拆箱:int k=in;(不用手动调用intValue())
说明:
装箱与拆箱的比较:
重要的点:
1.对于基本数据类型和其包装类进行比较操作(equals,==),其返回值都是true,因为基本数据类型的包装类的equals()方法都 被重写为值的比较
2. 对于包装类本身的比较
Integer in=new Integer(10)
Integer on=new Integer(10)
(1)in.equals(on) 返回为true,如1中说的equals方法被重写为值的比较
注意:如果Long l=new Long(10L),in.equals(l)返回false,因为这是不同包装类(Long,Integer)之间的比较,只有在 a.equals(c) 中c为a的基本数据类型或者包装类比较才会进行值的比较
(2)in==on 返回true;
但是 如果整形变量的值不是[-128,127]区间内的值,in==on就会返回false,如:
Integer a=new Integer(129)
Integer b=new Integer(129)
Integer temp=new Integer(0)
原因:装箱是通过valueof()方法将基本数据类型转换为包装类的,Integer的valueof方法里面会判断传入的基本类型是否在这个 [-128,127]区间内,如果在就会直接取放在IntegerCache.cache数组内的值,不在就会new一个 Integer对象
(3)a==(b+temp) 注意虽然不在[-128,127]区间内,但是返回值为true;
原因:当 “==”运算符的两个操作数都是 包装器类型的引用,则是比较指向的是否是同一个对象,而如果其中有一个操作 数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)
注意:Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的(都有一个区间,在区间范围 内new 比较返回true)。Double、Float的valueOf方法的实现是类似的(没有区间,即每次new 都会新建一个对象,比较返回false)。