JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题

JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题

因为java的8种基本数据类型中有6种是数字型的,所以他们的包装类都是继承于Object类下的Number类,所以调用以下的方法可以将任意数字型包装类转换成任意数字型基本数据。
《JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题》
源码中Integer类中常量的定义以及它的范围

《JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题》

自动装箱及拆箱问题

比如:
Integer i = 10;
在这里 i 是 Integer类的一个引用,是不能被赋值整型的,在JDK1.5之前编译是会被编译器报错的,在JDK1.5之后编译器会自动帮我们装箱和拆箱所以不会报错,其实质是编译器帮我们把 Integer i = 10; 转换成了 Integer i = Integer.valueOf(10); 最后在JVM中看到的就是后面的这种形式,所以能正常运行。
拆箱和装箱一样,比如 :

Integer int1 = Integer.valueOf(10);
int int2 = int1;
这样现在也不会报错,编译时编译器自动帮我们把 int int2 = int1; 改成了 int int2 = int1.intValue();了。

包装类的缓存问题

看一下如下代码:

Integer d1 = 1000;
Integer d2 = 1000;

Integer d3 = 100;
Integer d4 = 100;

System.out.println(d1==d2);

在这里大家都知道应该是false,因为d1和d2是两个对象的引用,这里比较的是他们的引用,也就是对象的地址是不是相同,他们是不同的,所以这里是false。
System.out.println(d1.equals(d2));
这个是比值的所以返回的自然是true。

那么再看一下下面这个,答案输出的竟然是true?!!!
System.out.println(d3==d4);

那么为什么会是这样的呢?
我们知道 Integer d3=100;实际上是 Integer d3 = valueOf(100);
我们可以看一下valueOf()的源码
《JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题》
可以看到如果传入的整数在[IntegerCache.low, InterCache.high]区间时,会直接返回IntegerCache.cache数组中的元素。那么IntegerCache.low和InterCache.high分别是多少呢?IntegerCache.cache数组中的元素又是多少呢?

《JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题》
《JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题》

《JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题》

可以看到cache数组已经初始化[-128,127],所以如果传入的数是个整数且这个数[-128,127],那么valueOf() 就会直接返回cache数组对于的元素,他们在cache数组中是唯一且不变的,可以看到cache数组是用final修饰的,所以当传入的整数在[-128,127]时,返回的总是cache数组中的同一个地址,所以d3==d4。

下面时整合在一起的代码和运行结果,可以看一下

用法见如下代码:

	public static  void main(String [] args) { 
        //基本数据类型转为对象
        Integer i = new Integer(100); //jdk9以后废弃,还能用
        Integer i2 = Integer.valueOf(150); //现在一般用这个

        // 包装类对象转为基本数据类型
        double d = i2.doubleValue();
        // 将字符串庶长子转为包装类对象
        Integer i3 = Integer.valueOf("123");
        Integer i4 = Integer.parseInt("123");

        //将包装类对象转成字符串
        String str = i3.toString();

        //一些常用的常量
        System.out.println(Integer.MAX_VALUE);  //2147483647
        System.out.println(Integer.MIN_VALUE);  //-2147483648

        //自动装箱
        Integer a = 300; // 编译器帮你改成:Integer a = Integer.valueOf(300);

        //自动拆箱
        int b = a;  // 编译器帮你改成:a.intValue();

        //包装类的缓存问题
        Integer d1 = 4000;
        Integer d2 = 4000;

        //当数字在[-128,127]之间的时候,返回缓存数组中的某个元素。
        Integer d3 = 123;
        Integer d4 = 123;

        System.out.println(d1 == d2);
        System.out.println(d3 == d4);
        System.out.println(d1.equals(d2));

     }

代码运行结果如下:
《JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题》

码字不易,转载请注明出处,谢谢!

    原文作者:Hoyoqaq
    原文地址: https://blog.csdn.net/YOUNG_DAA/article/details/117931448
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞