Java——装箱和拆箱

一.装箱和拆箱的概念

       基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。Java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装称为装箱,解包装称为拆箱)。

也就是说:

1.装箱指的是把值类型转化为引用类型
2.拆箱当然指的就是把引用类型转化为值类型

二.基本数据类型和对应的包装类

       在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了 一个包装类型.

 

三.装箱和拆箱

首先,装箱和拆箱的前提是两种类型一定是互相拥有继承关系的.

我们可以举一个简单的例子来说明拆箱和装箱

object val ="1"; 
int val1 = (int)val2;

这里就是把object类型(引用类型)的val1强制转化为了int类型(值类型)的val2,这种称为装箱.

 object val ="2"';
 int num=val;

 这里就是把object类型的val转化为int 类型的num, 而这里就是所谓的拆箱.

四.相关练习题

public static void main(String[] args) {
    Integer a = 150;
    Integer b = 150;
    Integer c = 240;
    Integer d = 240;
    System.out.println(a == b);
    System.out.println(c == d);
}

当我们遇到这样的一个练习题,输出的结果会是什么呢?我们可能理所当然的认为输出的结果都是true.但是当我们在程序运行后却发现,输出的结果却是true和false,这是为什么呢?

我们知道,Integer a=100这条语句会触发自动装箱,而自动装箱的方法为Integer.valueOf()方法

当我们转到Integer方法的时候,可以看出,此方法给出的 比较值i的范围是[-128-127]

所以当i的值位于[-128,127]的时候,会直接返回Integer缓存数组中相应对象的引用,如果i大于127或小于-128,会重新创建一个Integer实例,并返回。

因此第一个式子a和b的值都在缓存范围内,它们指向同一个对象,所以返回true。c和d的值不在范围内,都是通过new创建出来的,因此不是同一个对象,返回false。

五.拓展补充

Byte、Short、Integer、Long、Character的valueOf()实现机制是类似的。

其中相同值的Byte比较永远返回true,因为byte取值范围就是[-128,127]。

Short、Integer、Long的valueOf()基本一样,i的范围都需要在[-128,127]。

Character中i的范围只要小于等于127即可,因为char最小值为0,本来就大于等于-128。

但是Float、Double中的valueOf(),永远返回新创建的对象,因为一个范围内的整数是有限的,但是小数却是无限的,无法保存在缓存中。

Boolean中只有两个对象,要么是true的Boolean,要么是false的Boolean,只要boolean的值相同,Boolean就相等。

猜你喜欢

转载自blog.csdn.net/LxinY213/article/details/130354680