• 02 java包装类型的缓存机制 look


    02 java包装类型的缓存机制

    • Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。
    • Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False

    下面让我们来探究源码吧!

    Integer源码

    img

    可以看到 当我们需要转换的值在 -128>=x<=127 这个区间 会采用堆中的引用 不信看看下面的测试

    img

    测试

    可以看到 俩个对象在jvm中的内存地址是一样的 从来说明 使用的是缓存数据

    img

    Boolean源码

    跟Integer同样的方式进入

    • 可以看到 使用的是三元运算符的方式 TRUE和FALSE都是静态常量
    • static变量修饰变量: 在内存中只有一份,相同类的不同实例都指向同一份内存。
    • img

    img

    如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。

    两种浮点数类型的包装类 Float,Double 并没有实现缓存机制。

    下面我们来看一下问题。下面的代码的输出结果是 true 还是 false 呢?

    Integer i1 = 40;
    Integer i2 = new Integer(40);
    System.out.println(i1==i2);
    

    Integer i1=40 这一行代码会发生装箱,也就是说这行代码等价于 Integer i1=Integer.valueOf(40) 。因此,i1 直接使用的是缓存中的对象。而Integer i2 = new Integer(40) 会直接创建新的对象。

    因此,答案是 false 。你答对了吗?

    记住:所有整型包装类对象之间值的比较,全部使用 equals 方法比较什么是装箱拆箱

    img

  • 相关阅读:
    Linux下视频采集及其显示
    编译webcam_server
    mjpgstreamer
    linux下ffmpeg的安装
    armlinuxgcc的命令参数介绍
    ADS1.2如何生成BIN文件
    OpenJTAG下载bootloader 备忘
    Android 3.0 以下 使用Fragment 实例
    Dialog 学习备忘
    CentOS安装wsgi
  • 原文地址:https://www.cnblogs.com/look-word/p/16414806.html
Copyright © 2020-2023  润新知