动装箱与自动装箱何时发生

文章讨论了Java编程中自动装箱和自动拆箱的概念,例如将基本类型转换为对象包装器(如Integer)以及反之。它解释了当数值在特定范围内时,自动装箱会导致对象引用相同内存地址,从而影响对象间的比较。此外,手动创建Integer对象(如使用new关键字)不会遵循自动装箱的规则,导致不同的对象实例。
摘要由CSDN通过智能技术生成

动装箱与自动装箱何时发生

将一个基本类型赋值给对象包装器对象,就会发生自动装箱。比如:

List<Integer> list = new ArrayList<>();

        // 此处发生自动装箱:相当于 list.add(Integer.valueOf(3))

        list.add(3);

将一个包装器对象赋值给基本类型,就会发生自动拆箱。比如

List<Integer> list = new ArrayList<>();

        // 此处发生自动装箱:相当于 list.add(Integer.valueOf(3))

        list.add(3);

        // 此处发生自动拆箱:相当于 list.get(0).intValue();

        list.get(0);

对象包装器对象之间的比较

由于自动装箱和自动拆箱,使我们觉得对象包装器对象之间的比较,好像使用 == 运算符也可以,== 运算符运用在对象之间,

实际是比较对象是否指向同一个内存区域。那么我们猜测一下,下面代码运行的结果是多少:

Integer i1 = 100;

        Integer i2 = 100;

        System.out.println(i1 == i2);

        Integer i3 = 300;

        Integer i4 = 300;

        System.out.println(i3 == i4);

        Integer i5 = new Integer(100);

        Integer i6 = new Integer(100);

        System.out.println(i6 == i5);

————————————————

true

false

false

自动装箱规范要求 boolean、byte、char <= 127,介于 -128 ~ 127 之间的 short 和 int 被包装到固定的对象中。(此句话出自 Java 核心技术卷 1 的 185 页)

所以 i1 和 i2 其实指向的是一个对象,所以为 true。i3 与 i4 指向的是两个对象,所以为 false。而 i5 和 i6 不是自动装箱,属于手动装箱,所以不遵守自动装箱规范,也是两个对象,所以为 false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值