Java的自动装箱与自动拆箱

-什么是装箱和拆箱?

装箱:

原始类型到对应包装类的转换,比如int转换成Integer。

举个栗子:Integer i = 10;

拆箱:

反之, 将Integer对象转换成int类型值。

Integer i = 10;

int n = i;

注:

基本数据类型与包装类对应表
基本数据类型包装类
byte(1字节)Byte

short(2字节)

Short
float(4字节)Float
long(8字节)Long
char(2字节)Character
int(4字节)Integer
double(8字节)Double
boolean(未定)Boolean

怎么实现?

装箱和拆箱是编译器自动完成的,装箱的时候调用的是包装类的valueOf()方法,该方法要传入的参数就是对应的基本数据类型,拆箱的时候就是自动调用包装类的xxxValue方法。

易错点:

public static void main(String[] args){

        
        Integer a = 127;
        
        Integer b = 127;

        
     //== 比较的是两个对象的内存地址,
     //如果其中有一个操作数是算术运算等表达式,则比较的是数值(即会触发自动拆箱的过程)
        System.out.println(a==b);//true

        

        Integer c = 128;
        
        Integer d = 128;

        System.out.println(a==b);//false
        

}

为什么两个比较的返回不相同呢?

这是因为JVM将-128到127之间的数值提前放到了方法区的整数型常量池中,所以当我们用到这个范围内的数值时,其引用的都是方法区的对象,同一个数值的对应的是同一个对象,因此上述代码中a==b返回的是true。而对于不在这个范围内的数值的引用,JVM会在堆中new一个对象,所以尽管数值是相同的,引用的对象每次都是不一样的,c==d返回的就是false。

拓展

Integer i = new Integer(xxx) 和 Integer i = xxx 的区别?

   (1)通过new的方式不会触发自动装箱,而直接赋值则会触发

    (2)通过new新建对象是直接在堆内存中新建一个对象,再赋值,这样每个new出来的对象都不是同一个对象。直接赋值的原理是;先在java的常量池中找,如果找不到再通过new Integer创建对象,进行装箱。

希望本文能对你有所帮助,如果有大佬发现有错误,还希望能帮我指出来!我及时纠正;或者有朋友能够补充的也可以提出来,大家一起学习,一起进步!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值