当前位置: 首页 > article >正文

【AI驱动的数据结构:包装类的艺术与科学】

](https://img-home.csdnimg.cn/images/20220524100510.png#pic_center)
🌈个人主页: Aileen_0v0
🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法
💫个人格言:“没有罗马,那就自己创造罗马~”

文章目录

    • 包装类
    • 装箱和拆箱
    • `阿里巴巴面试题`

包装类

  • 在Java中基本数据类型不是继承来自Object,为了在泛型代码中使用基本数据类型,Java给每个基本数据类型都对应到了一个包装类中。
基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

装箱和拆箱

装箱/装包 : 把基本类型转变成包装类型
拆箱/拆包:把一个包装类型转变成基本数据类型
public class Test {
    public static void main(String[] args) {
        int a = 10;
        Integer ii = a ; //自动装箱

        Integer ii2 = new Integer(10);
        int b = ii2;//自动拆箱

        System.out.println(ii);
        System.out.println(b);
    }
}

在这里插入图片描述

在这里插入图片描述
通过访问上面代码的字节码文件,我们可以看到装箱的底层逻辑就是通过Integer这个类去调用valueOf这个方法去装箱。

public class Test {
    public static void main(String[] args) {
        int a = 10;
//        Integer ii = a ; //自动装箱
        //根据字节码文件的内容可以将自动装箱的代码写成如下样式:
        Integer ii = Integer.valueOf(a);//手动装箱
//================================================================================
        Integer ii2 = new Integer(10);
//        int b = ii2;//自动拆箱
        int b = ii2.intValue();//手动拆箱
        double d = ii2.doubleValue();//即使原来不是小数类型也能手动拆箱成小数类型
        System.out.println(ii);
        System.out.println(b);
        System.out.println(d);
    }
}

在这里插入图片描述


阿里巴巴面试题

    public static void main(String[] args) {
        Integer ii= 100;
        Integer ii2 =100;
        System.out.println(ii == ii2);
    }

在这里插入图片描述

    public static void main(String[] args) {
        Integer ii= 200;
        Integer ii2 =200;
        System.out.println(ii == ii2);
    }

在这里插入图片描述

  • 为什么上面的结果一个是true,一个是false,这是为什么呢?

    • 从上面代码中我们可以看到整个过程中都使用到了装箱,通过查看装箱的源代码valueOf
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

根据原代码我们可知道:cache是缓存数组,如果我们的i是在这个范围内的,他就会返回这个缓存数组,如果不在他就会再重新创建一个对象。如下图所示:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
对于100,他是在我们数组的范围内,所以它无需创建对象,只需要在缓存数组中查找即可,这两个装箱的变量他们指向的都是同一个对象的地址所以返回true,而200则需要创建新的对象,这两个变量所指的不是同一个对象,内存地址也不一样,所以返回false。

](https://img-home.csdnimg.cn/images/20220524100510.png#pic_center)
](https://img-home.csdnimg.cn/images/20220524100510.png#pic_center)


http://www.kler.cn/a/451472.html

相关文章:

  • 如何学习Trustzone
  • Linux下载RabbitMQ,并解决Github拒绝访问443的问题
  • 【仓颉语言体验】Hello World TCP客户端 C/C++ or Python
  • ResEmoteNet论文阅读与推理
  • 【可视化开源性能压测工具】小巧而强大的oha
  • 【数据结构2】线性表——顺序表
  • 动态规划:石子合并 图文+举例超详细说明
  • OpenCV相机标定与3D重建(26)计算两个二维点集之间的部分仿射变换矩阵(2x3)函数 estimateAffinePartial2D()的使用
  • AWTK 在树莓派 pico 上的移植笔记
  • HTMLCSSJavaScriptDOM 之间的关系?
  • 组态页面渲染器通过npm包方式使用页面没有渲染成功的问题
  • gesp(三级)(14)洛谷:B4039:[GESP202409 三级] 回文拼接
  • 贪心算法求解加油站问题
  • 《ROS2 机器人开发 从入门道实践》 鱼香ROS2——第4章内容
  • WebAuthn 项目常见问题解决方案
  • C++抽象类与类继承相关注意事项 [学习笔记]
  • select 1 from table的作用 详解
  • 【ue5学习笔记2】在场景放入一个物体的蓝图输入事件无效?
  • sentinel学习笔记8-系统自适应与黑白名单限流
  • LabVIEW实现GSM/GPRS通信