【自动装箱以及包装类的缓存】⭐️通过具体案例看下每种包装类的不同结果

目录

前言

一、自动装箱与拆箱(以 Integer 包装类为例)

二、再来看看几个示例

​编辑三、Double ,Float 类型亦是如此吗?


前言

        小伙伴们大家好,日常使用业务层方面的代码居多,但也不可忘了基本的一些代码格式以及原理,比如最近看到的一种题型,这里就涉及到了自动装箱的基础知识了

        Integer i = new Integer(10);
        Integer j = 10;
        Integer k = 10;
        System.out.println(i == j);   //false
        System.out.println(k == j);   //true

一、自动装箱与拆箱(以 Integer 包装类为例)

        1、装箱就是自动将基本数据类型转换为包装器类型( int >> Integer),调用Integer.valueOf(int )方法

        2、拆箱就是反过来,将包装器类型转换为基本数据类型,调用了Integer.intValue方法

        3、java并不是一开始就支持自动拆装,查了下是在Java SE5之后才支持该功能

        自动装箱之后写法对比

        Java SE5之前:Integer i = new Integer(10);

        Java SE5之后:Integer i = 10;

二、再来看看几个示例

        1.比如前言中提到的 i 和 j 为什么不相等?

Integer i = new Integer(10)

         创建了一个新的Integer对象,而Integer j = 10; 则会自动装箱,实际上会调用Integer Integer j = 10

        实际上进行了装箱操作,相当于调用了Integer.valueOf(10)                 

        而由于10在缓存范围内,因此会复用缓存中的对象。

i和j虽然表示的是相同的值,但是i和j指向的是不同的对象,所以表达式 i == j 的结果是false

        2.通过new 关键字生成的Integer对象比较

        Integer i = new Integer(127);
        Integer j = new Integer(127);
        System.out.println(i == j);   //false

 ij 分别是通过 new Integer(127) 创建的两个不同的对象,会被强制创建为新的对象,而不是从缓存中获取。即使值相同,但它们在内存中的位置不同,因此比较 i == j 会返回 false

        3.Integer.valueOf 方法缓存的对象大小区间

        Integer k = 10;
        Integer l = Integer.valueOf(10);
        Integer l1 = Integer.valueOf(128);
        System.out.println(k == l);   //true
        System.out.println(k == l1);  //false

Integer k = 10;

Integer l = Integer.valueOf(10);

    这两行代码执行时,都会将值为10的整数赋给Integer对象。在Java中,对于数值范围在-128到127之间的整数,会被缓存起来,所以当你比较 k == l 时,因为10在缓存范围内,它们实际上指向的是同一个对象,所以返回true。

          而当比较 k == l1 时,因为128不在缓存范围内,所以 Integer.valueOf(128) 会创建一个新的Integer对象,与 Integer k = 10; 创建的对象不同,因此返回false。

        来看下 Integer.valueOf 方法内部 ,制定了数值范围如果是在[-128,127]之间,返回IntegerCache缓存中已经存在的对象的引用,否则创建一个新的 Integer对象,所以k 和 l 指向的是同一个对象,k 和 l1 分别指向不同的对象

三、Double ,Float 类型亦是如此吗?

        Double i = 10.0;
        Double j = 10.0;
        Float i1 = 10.0f;
        Float j1 = 10.0f;
        Long i2 = 10l;
        Long j2 = 10l;
        System.out.println(i == j);   //false
        System.out.println(i1 == j1);   //false
        System.out.println(i2 == j2);   //true

         通过结果可以看出,Long 类型之外的都没有缓存的功能

因为为了性能和内存的考虑,只对整数类型的包装类(如Integer、Long等)进行了缓存优化,而没有对浮点数类型的包装类(如Float、Double等)进行缓存,具体分为以下几点。

  1. 整数类型的范围相对较小,而且常常被使用到,因此缓存能够显著提高性能。
  2. 整数类型的对象在程序中经常被频繁使用,缓存能够减少内存的占用和对象的创建次数。
  3. 对于浮点数类型,范围更广,而且通常不像整数类型那样被频繁使用。缓存这些类型可能会导致内存开销过大,而且由于浮点数的精度和计算方式的特殊性,可能会引入更多的问题而不是性能提升。

四、章末

        好了,文章到这里就结束了~ 

相关推荐

  1. 装箱与拆箱, 包装缓存机制

    2024-03-31 06:20:05       29 阅读
  2. 包装缓存问题

    2024-03-31 06:20:05       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-31 06:20:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-31 06:20:05       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-31 06:20:05       82 阅读
  4. Python语言-面向对象

    2024-03-31 06:20:05       91 阅读

热门阅读

  1. 简单图论的知识

    2024-03-31 06:20:05       32 阅读
  2. Docker 搭建 Blockbridge

    2024-03-31 06:20:05       41 阅读
  3. 【软考】防火墙技术

    2024-03-31 06:20:05       36 阅读
  4. 【阅读笔记】《克拉克森的农场》

    2024-03-31 06:20:05       32 阅读
  5. Linux下使用vim文本编辑器

    2024-03-31 06:20:05       32 阅读
  6. ChatGPT指引:借助ChatGPT撰写学术论文的技巧

    2024-03-31 06:20:05       34 阅读
  7. ajax的优缺点有哪些?

    2024-03-31 06:20:05       38 阅读
  8. ssh连接

    2024-03-31 06:20:05       32 阅读
  9. C++类继承基础3——访问控制与继承

    2024-03-31 06:20:05       33 阅读
  10. 2024.2.5力扣每日一题——跳跃游戏6

    2024-03-31 06:20:05       38 阅读