java中的装箱和拆箱详解

什么是装箱和拆箱

装箱就是自动将基本数据类型转换为包装器类型。
拆箱就是自动将包装器类型转换为基本数据类型。

装箱和拆箱的原理

自动装箱都是通过包装类的 valueOf() 方法来实现的.自动拆箱都是通过包装类对象的 xxxValue() 来实现的。

场景介绍

  • 包装类与基本数据类型进行比较运算,是先将包装类进行拆箱成基本数据类型,然后进行比较的。
  • 两个包装类型之间的运算,会被自动拆箱成基本类型进行计算。
  • 基本数据类型放入集合类中的时候,会进行自动装箱。
  • 三目运算符的使用过程中。当第二,第三位操作数分别为基本类型和对象时,其中的对象就会拆箱为基本类型进行操作。
  • 函数参数与返回值。

装箱缓存

  • 装箱才会使用到缓存。
  • Byte, Short, Long有固定范围: -128 到 127。对于Character, 范围是 0 到 127。除了Integer以外,这个范围都不能改变。

总结

  1. Ingeter是int的包装类,int的初始值为0,Ingeter的初始值为null。
  2. 无论如何,Integer与new Integer()不会相等。不会经历拆箱过程,Integer i8 = new Integer(127)的引用指向堆,而Integer i4 = 127指向专门存放他的内存(常量池),他们的内存地址不一样,使用 == 比较都为false。
  3. 两个都是非new出来的Integer,使用 == 比较,如果数在-128到127之间,则是true,否则为false。
  4. 两个都是new出来的,==比较都为false。若要比较值是否相等,需使用equals方法进行比较。
  5. int和Integer(无论new否)比较,都为true,因为会把Integer自动拆箱为int再去比。

实验

public class Test {
 
    public static void main(String[] args) {
 
        // 两个new出来的Integer类型的数据比较,相当于把new出来的地址作比较
        Integer a0 = new Integer(1);
        Integer a1 = new Integer(1);
        System.out.println("Integer 对象作比较 a0 == a1: " + (a0 == a1));
 
        // 调用intValue方法得到其int值
        System.out.println("使用intValue得到int值作比较 a0 == a1: " + (a0.intValue() == a1.intValue()));
 
        // 把Integer类型的变量拆箱成int类型
        int a2 = 1;
        System.out.println("将Integer自动拆箱 a1 == a2: " + (a1 == a2));
 
        // Integer对象赋值比较,其实也是内存地址的比较
        // 自动装箱,如果在-128到127之间,则值存在常量池中
        Integer a3 = 30;
        Integer a4 = 30;
        System.out.println("Integer对象赋值比较 a3 == a4: " + (a3 == a4));
 
        // Integer对象赋值(超过-128~127区间)比较
        Integer a5 = 128;
        Integer a6 = 128;
        System.out.println("Integer对象赋值(超过-128~127区间)比较 a5 == a6: " + (a5 == a6));
 
        // Integer对象赋值(超过-128~127区间)比较,调用intValue后再作比较
        Integer a7 = 128;
        Integer a8 = 128;
        System.out.println("Integer对象赋值(超过-128~127区间)比较,调用intValue后 a7 == a8: " + (a7.intValue() == a8.intValue()));
 
        // 使用Integer类的equals()方法进行的是数值的比较 
        Integer a9 = 129;
        Integer a10 = 129;
        System.out.println("Integer类的equals()方法进行的是数值的比较 a9 == a10: " + a9.equals(a10));
    }
}

在这里插入图片描述

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泡^泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值