455-javaSE进阶-自动装箱和自动拆箱

IntegerTest05.java

  • 主要看装箱和拆箱的问题
package com.bjpowernode.javase1.integer1;

    public class IntegerTest05 {
    public static void main(String[] args) {
        //自动装箱
        //基本数据类型 --> 包装类
        //100为基本数据类型,qwe为包装类,直接=,自动转换
        /*那不同的数据类型进行转换,需不需要进行强制数据类型转换呢?*/
/*        //答:发现自动装箱和自动拆箱,不是相同的数据类型不能进行转换,
          //例如: int <--> Integer , double <--> Double */
        Double qwe = 3.1415926;

        //自动拆箱
        //包装类 --> 基本数据类型
        //qwe为包装类,a1为基本数据类型,直接=,自动转换
        double a1 = qwe;
        System.out.println(a1);



        // z是一个引用,z是一个变量,z还是保存了一个对象的内存地址。
        Integer z = 1000;  // 等同于:Integer z = new Integer(1000);
        /*自动装箱
         * z是包装类*/

        // 分析为什么这个没有报错呢?
        // +两边要求是基本数据类型的数字,z是包装类,不属于基本数据类型,这里会进行自动拆箱。将z转换成基本数据类型
        // 在java5之前你这样写肯定编译器报错。

        System.out.println(z + 1);
        /*包装类为什么可以进行加减?
        *   // 这里自动拆箱,+两边要求是基本数据类型的数字,现在是一个基本数据类型,然后进行加减*/

        Integer a = 1000;  // Integer a = new Integer(1000); a是个引用(变量),保存内存地址指向对象。
        // 等价于Integer a = new Integer(1000)
        /*自动装箱*/
        Integer b = 1000;  // Integer b = new Integer(1000); b是个引用(变量),保存内存地址指向对象。
        /*自动装箱*/
        System.out.println(a == b);  //false
        /*==比较的是内存地址,这里我觉得是不相等的,
        * 因为在堆里生成了两个内存地址,a和b */

    }
}

输出:
3.1415926
1001
false

进程已结束,退出代码 0

一个面试题

  • 说明了缓存
  • 缓存机制是为了提高效率
package com.bjpowernode.javase1.integer1;
/*
这个题目是Integer非常重要的面试题。
 */
public class IntegerTest06 {
    public static void main(String[] args) {

        Integer a = 127;
        Integer b = 127;
        System.out.println(a == b);   //true
        /*
        java中为了提高程序的执行效率,将[-128到127]之间所有的包装对象提前创建好,
        放到了一个方法区的“整数型常量池”当中了,目的是只要用这个区间的数据不需要
        再new了,直接从整数型常量池当中取出来。

        原理:x变量中保存的对象的内存地址和y变量中保存的对象的内存地址是一样的。
         */

        /*整数型常量池中已经有个很多对象*/

        /*这里说到了缓存机制,主要是为了提高效率
        * 提前创建好的,就像去吃饭,桌子是摆好的,下一个人去吃饭直接用桌子
        * 这个桌子就可以看成缓存
        * 缓存是一种优化,缓存机制可能是提前备好放到内存里
        * 就像打开京东的主页面,很多图片和框架可能就是存在于内存中的,
        * 直接从内存中拿,不需要从数据库里查询了,为了网页打开的效率,
        * 缓存的优点:效率高  缓存的缺点:占用内存*/
        System.out.println("==========");

        Integer x = 128;
        Integer y = 128;
        System.out.println(x == y);  //false
    }
}

输出:
true
==========
false

进程已结束,退出代码 0

posted @ 2020-10-26 08:38  nkndlawn  阅读(99)  评论(0编辑  收藏  举报