预备知识---java中的包装类(装包与拆包)

基本数据类型和包装类直接的对应关系

在这里插入图片描述
基本就是类型的首字母大写,除了 Integer 和 Character。

装包/装箱

装包(装箱)的概念

把简单类型 包装成 对应的包装类

装包的形式(两种)

  • 自动装包
  • 显示装包

代码示例

public class TestDemo3 {
    
    
    public static void main(String[] args) {
    
    

        int a = 10;
        //显示装包方法1:
        Integer integer1 = new Integer(a);
        //输出结果为10
        System.out.println(integer1);
        //显示装包方法2:使用valueof方法
        Integer integer2 = Integer.valueOf(a);
        //输出结果为10
        System.out.println(integer2);



        //自动装包 
        //自动装包程序内部其实也是调用了Integer.valueof方法
        Integer integer3 = a;
        //输出结果为10
        System.out.println(integer3);

    }
}

拆包/拆箱

拆包(拆箱)的概念

把包装类变为简单类型

拆包的形式(两种)

  • 自动拆箱
  • 显示拆箱

代码示例

public class TestDemo3 {
    
    
    public static void main(String[] args) {
    
    

        //自动拆箱
        Integer integer = 10;
        int b = integer;
        //输出结果为10
        System.out.println(b);

        //显示拆箱
        //调用intValue方法
        int c = integer.intValue();
        //输出结果为10
        System.out.println(c);
        //调用doubleValue方法
        double d = integer.doubleValue();
        //输出结果为10.0
        System.out.println(d);
    }
}

练习(一般出选择题)

判断下面的语句是true还是false

public class TestDemo3 {
    
    
    public static void main(String[] args) {
    
    

        Integer a = 100;
        Integer b = 100;
        //true
        System.out.println(a == b);
        Integer c = 139;
        Integer d = 139;
        //false
        System.out.println(c == d);
    }
}

为什么等于100的时候为true,等于139的时候就为fasle了呢?
答:首先我们把简单类型给包装类是装包,装包底层调用的都是Intger.valueOf方法,下面我们来看valueOf方法的源码:
在这里插入图片描述
可以看到当i=100的时候此时进入到我们的valueOf方法中,然后进行if语句的判断:
在这里插入图片描述
可以看到当我们点到low的时候,low的值为-128,high的值如下所示,为127
所以当我们传入100的时候,100此时大于-128,小于127,所以执行里面的语句,可以看到最后返回的是一个缓存数组cache,这个数组的取值范围为-128-127,说明数组中一共有256个数字,然后当i=100的 时候,此时要返回的值在数组的下标值为100+(-(-128))=228,所以此时返回cache数组中下标为228所对应的数字.也就是100这个数字,所以此时当我们判断a==b的时候,其实就是两个数字判断是否相等,此时当然相等,所以返回true.
而当我们输入的形参i值为139时,此时其范围已经超出了-128到127之间,那么此时便会返回一个新的对象,所以说c,d会分别创造一个自己的对象,那么前面我们说过,对象和对象之间的比较其实就是引用和引用之间的比较,而其比较的就是地址是否相同,c,d每次创建的新的对象都存在堆中,而地址是不相同的,所以c == d的值为false

Guess you like

Origin blog.csdn.net/qq_41972686/article/details/120119710