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


🌈个人主页: Aileen_0v0
🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法

💫个人格言:"没有罗马,那就自己创造罗马~"

文章目录

包装类

  • 在Java中基本数据类型不是继承来自Object,为了在泛型代码中使用基本数据类型,Java给每个基本数据类型都对应到了一个包装类中。
基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

装箱和拆箱

|----------------------|
| 装箱/装包 : 把基本类型转变成包装类型 |

|------------------------|
| 拆箱/拆包:把一个包装类型转变成基本数据类型 |

java 复制代码
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这个方法去装箱。

java 复制代码
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);
    }
}

阿里巴巴面试题

java 复制代码
    public static void main(String[] args) {
        Integer ii= 100;
        Integer ii2 =100;
        System.out.println(ii == ii2);
    }
java 复制代码
    public static void main(String[] args) {
        Integer ii= 200;
        Integer ii2 =200;
        System.out.println(ii == ii2);
    }
  • 为什么上面的结果一个是true,一个是false,这是为什么呢?

    • 从上面代码中我们可以看到整个过程中都使用到了装箱,通过查看装箱的源代码valueOf
java 复制代码
    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。


相关推荐
HackTwoHub9 分钟前
AI大模型网关存在SQL注入、附 POC 复现、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·网络安全·系统安全·网络攻击模型·安全架构
wuminyu14 分钟前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
段一凡-华北理工大学17 分钟前
【高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章08:多模态数据融合:让数据更聪明
人工智能·python·高炉炼铁·ai赋能·工业智能体·高炉炉温
其实防守也摸鱼37 分钟前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
.小小陈.44 分钟前
Linux 线程概念与控制:从底层原理到实战应用
linux·运维·jvm
网络工程小王1 小时前
【LangChain 大模型6大调用指南】调用大模型篇
linux·运维·服务器·人工智能·学习
HIT_Weston1 小时前
63、【Agent】【OpenCode】用户对话提示词(示例)
人工智能·agent·opencode
wangbing11251 小时前
各linux版本的包管理命令
linux·运维·服务器
CV-杨帆1 小时前
Phi-4-mini-flash-reasoning 部署安装与推理测试完整记录
人工智能
Joseph Cooper1 小时前
Linux/Android 跟踪技术:ftrace、TRACE_EVENT、atrace、systrace 与 perfetto 入门
android·linux·运维