深入理解Java的装箱拆箱

本文详细解析了Java中的自动装箱和拆箱过程,并通过实例展示了不同情况下Integer对象之间的比较,包括==和equals方法的区别,以及值缓存的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引入

Integer i = 11;
这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。
那什么是拆箱呢?顾名思义,跟装箱对应,就是自动将包装器类型转换为基本数据类型:
Integer i = 11; //装箱
int n = i; //拆箱
简单一点说,装箱是 自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。

代码展示

public class Test {
    public static void main(String[] args) {
        /*int 和 int 类型之间进行比较,他们之间只能通过 == 进行对比,基本数据类型没有  equals 方法*/
        int a = 128;
        int b = 128;
        System.out.println(a==b);
        System.out.println("-----------------------");
        /*int 和 integer 之间,integer 自动拆箱 == 和 equals 都为true*/
        int c = 130;
        Integer d= 130;
        System.out.println(c == d);
        System.out.println(d.equals(c));
        System.out.println("-----------------------");
        /*int 和 new integer 之间,integer 也会自动拆箱,== 和 equals 都为true*/
        int aa = 130;
        Integer bb = new Integer(130);
        System.out.println(aa==bb);
        System.out.println(bb.equals(aa));
        System.out.println("-----------------------");

        /*integer 和 integer 进行比较*/
        /*这个号不同于我们前面的,两个integer的话,会自动装箱,这里有个注意的地方,就是如果值在【-128,127】之间的话
         ,由于值缓存在integercache中,不会再去创建新的对象,直接从缓存中获取已经创建好的对象。如果超出了这个范围,会
         直接通过new 方法创建对象*/
        /*因此如果通过 == 方法进行比较的时候,在【-128,127】之间的时候,为true 否则就是false*/
        /*要是使用equals方法的话,比较内容  所以为true*/
        Integer a1 = 126;
        Integer a2 = 126;
        System.out.println(a1 == a2);/*true*/
        System.out.println(a1.equals(a2));/*true*/
        System.out.println("integer 两个在范围内-----------------------");
        Integer a11 = 128;
        Integer a22= 128;
        System.out.println(a11 == a22);/*false*/
        System.out.println(a11.equals(a22));/*true*/
        System.out.println("integer两个不在范围内-----------------------");

        /*integer 和 new integer 进行比较*/
        /*new integer 会创建对象,存储在堆中,integer的话,如果在【-128,127】之间的话,从缓存取出,否则new integer*/
        /*通过 == 比较的话,肯定false ,equals肯定wei true*/
        Integer cc = 126;
        Integer dd = new Integer(126);
        System.out.println(cc == dd);/*false*/
        System.out.println(cc.equals(dd));/*true*/
        System.out.println("integer 和 new integer-----------------------");

        /*new integer 和 new integer 和上面的一个差不多,现在两个都需要通过new 创建对象,两个对象的地址不相同*/
        /*==比较为false  equals 比较为true*/
        Integer mm = new Integer(129);
        Integer nn = new Integer(129);
        System.out.println(mm == nn);/*false*/
        System.out.println(mm.equals(nn));/*true*/
        System.out.println("new integer 和 new integer-----------------------");

        /*下面的两个,一个是直接引用了,另一个则是还会新创建*/
        Integer oo = mm;
        System.out.println(mm == oo);/*true*/
        System.out.println(mm.equals(oo));/*true*/
        System.out.println("利用一个创建-----------------------");

        Integer pp = new Integer(mm);
        System.out.println(mm == pp);/*false*/
        System.out.println(mm.equals(pp));/*true*/
        System.out.println("利用一个新创建-----------------------");
    }
}

运行结果

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值