java中的自动装箱与拆箱全解析

1、自动装箱与自动拆箱

​ (1)在 java中,数据类型分为两大类:基本类型引用类型

​ 基本类型是数值不是对象,不能调用对象的toString()、hashCode ()、getClass()、equals()等方法。

​ (2)定义:拆箱和装箱使非人为的,自动装箱能在java中将基本类型转换为引用类型,比如int值转为Integer 对象,反之为拆箱。

​ (3)拆箱和装箱的基本类型:byte、short、 int、long、float、 double、boolean、char。分别装箱为Byte、 Short、Integer、Long 、Float、Double、 Boolean、Character。

​ 自动装箱时编译器调用valueOf将原始类型值转换为对象,自动拆箱时编译器通过调用类似intValue()、doubleValue()等的方法将对象转换为原始类型值。

Integer intNum = 5;//已经自动将int类型转为Interger类型,程序运行的时候,编译器自动帮你转
Double doubleNum = 6.0;
Float floatNum = 6.0;
...

还有一些地方必须使用装箱的类型,比如HashMap和List等。

比如使用List的时候,就常到自动装箱和拆箱。
List<Integer> list = new ArrayList<>();
list.add(1);//自动将int值为1的数装箱为Integer类型
int firstValue = List.get(0);//获取 List下标为0的值,此时会将List里面的 引用对象 转为 值,

​ 但是能不用拆箱装箱的地方,便不用拆箱装箱,因为这会增加 GC的压力、要尽量避免生成无用对象,也会影响效率,比如:

Integer sum = 0;
for(int i=0;i<5000;i++){
	sum += i;
}

​ 在0-127的循环过程中是没有重新new一个对象的,而是直接返回缓存中的Integer对象,但是超过了int值的范围,则会自动装箱为包装类,此时会new一个新的对象,一直循环到5000的每一次都会new一个新的对象,增加GC的压力,耗费内存,降低性能。

(4)注意:还有如果要使用自动装箱的引用类型,必须要初始化对象,当我们进行一个基本类型和一个对象比较时,如果这个对象没有进行初始化或对象为 null,在自动拆箱过程中会抛出空指针异常。

(6) 那既然存在这么多风险,为何还要选择使用自动装箱拆箱呢?

因为一些数据结构只接受对象,不接受原始类型,比如 List.HashMap,等

还有一个很重要的就是泛型,具体的留到泛型再说。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值