首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【AI驱动的数据结构:包装类的艺术与科学】

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

作者头像
ImAileen
发布2024-12-21 20:12:01
发布2024-12-21 20:12:01
8800
代码可运行
举报
运行总次数:0
代码可运行

包装类

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

基本数据类型

包装类

byte

Byte

short

Short

int

Integer

long

Long

float

Float

double

Double

char

Character

boolean

Boolean

装箱和拆箱

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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这个方法去装箱。

代码语言:javascript
代码运行次数:0
运行
复制
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);
    }
}

阿里巴巴面试题

代码语言:javascript
代码运行次数:0
运行
复制
    public static void main(String[] args) {
        Integer ii= 100;
        Integer ii2 =100;
        System.out.println(ii == ii2);
    }
代码语言:javascript
代码运行次数:0
运行
复制
    public static void main(String[] args) {
        Integer ii= 200;
        Integer ii2 =200;
        System.out.println(ii == ii2);
    }
  • 为什么上面的结果一个是true,一个是false,这是为什么呢?
    • 从上面代码中我们可以看到整个过程中都使用到了装箱,通过查看装箱的源代码valueOf
代码语言:javascript
代码运行次数:0
运行
复制
    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。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 包装类
  • 装箱和拆箱
  • 阿里巴巴面试题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档