自动装箱和拆箱

自动装箱和拆箱

每个基本数据类型都有自己对应的包装类。自动装箱和自动拆箱也是比较重要的知识点!面试常问

自动装箱、拆箱其实可以理解为:把东西装进箱子里,然后在拿出来。其实分为:自动拆装箱和手动拆装箱

补充一下自动类型提升、强制类型转换的问题。

在这里插入图片描述

上边只有第二条语句编译是通过的,注意以下两点。

①两个byte相加,最后的结果需要强转为int,需要用int接收。

②final定义的变量将不可变,无论是类型还是值都不能改变。


好了,接着回归正题。

问题:你知道int和Integer的区别吗?

首先,Integer是int类型的包装类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qCYw7p1T-1619396267948)(C:\Users\1\AppData\Roaming\Typora\typora-user-images\image-20210426075530424.png)]

因为Integer会把传入的数值和字符串转为数字才行,也就是说引号中是数字才行,而不能转为其他,像"abc"是不行的。虽然编译没错。


问题:手动拆箱、手动装箱

首先,看一下下面例子,并找出区别。

Integer a = new Integer(8);
int a = 8;

第一行的a相当于是对象引用,指向了8这个数值,装箱相当于包装类把数字装进箱子里,这就是一个对象,而不是一个简单的数值类型了。

其实也可以直接像第二行一样,直接定义既可。

int i = a.valueOf();

这里就相当于把箱子里的东西拿出来。拆箱还原成原来的int型。


​ 上边还只是手动拆装箱,下边来看看自动拆装箱

问题:自动拆箱、自动装箱

顾名思义,自动装箱就是自动的将int型的数据,转为Integer类型的数据。

Integer a = 7; //自动装箱
intd = b;//自动拆箱

从上可以看出,自动拆装箱可以转换的更简单了。

下边举几个经典例子彻底了解一下拆装箱。

 public static void main(String[] args) {
        Integer a = 1024;
        Integer b = 1024;
        System.out.println(a == b);
        
    }

打印的结果肯定是 false,因为虽然数值一样,但是地址值不一样,都是在堆空间中新new的对象,所以地址值不一样。

  public static void main(String[] args) {
        Integer a = 66;
        
        Integer b = 66;
        
        System.out.println(a == b);

    }

这个打印结果,就是true,分析如下。

引出知识点

a 和 b的取值只要在**-128到127之间,那么他们指的就是同一个,即使==比较的是两者的引用,两者也是相同的,因为-128到127这些数字是使用频率比较高的,就产生了一个整型常量池**,这些数字会存放在这里,有相同的数字则不会再次创建,所以a和b指的是同一个,因此两者相同,当然如果是在这个范围之外的数字,那结果就是false了
字是使用频率比较高的,就产生了一个整型常量池,这些数字会存放在这里,有相同的数字则不会再次创建,所以a和b指的是同一个,因此两者相同,当然如果是在这个范围之外的数字,那结果就是false了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值