java学习笔记 -21/9/9 自动装箱与拆箱

自动拆箱指的是:将包装类型转为基本类型,比如将Integer对象转换成int值。

自动装箱指的是:将基本类型转换包装类型,比如将int值转换为Integer对象。

  1. 包装类型可用于泛型,而基本类型不可以,否则会出现编译错误,如下: 
  List<int> list1 = new ArrayList<>();//提示:type argument cannot be of primitive type,类型参数不能是基本数据类型


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

   2. 基本类型比包装类型更高效。

   3.两个包装类型的值可以相同,但不相等,看下面代码:

 Integer i1 = new Integer(10);

 Integer i2 = new Integer(10);

 System.out.println(i1 == i2);//false
 System.out.println(i1.equals(i2));//true

 两个包装类型在使用 == 进行判断时候,判断的是指向的地址是否相同,由于是两个对象,所以地址是不同的。

而 i1.equals(i2) 的输出结果为true,是因为equals() 方法比较的是两个int值是否相等。

java1.5为了减少开发人员的工作,提供了自动装箱与自动拆箱的功能,如下: 

 Integer i3 = 10;

 int i4 = i3;

 反编译后的代码:

Integer i3 =Integer.valueOf(10);

int i4 = i3.intValue();

也就是说,自动装箱是通过 Integer.valueOf() 完成的;自动拆箱是通过 Integer.intValue() 完成的;

自动装拆箱是一个很好的功能,大大节省了我们开发人员的精力,但也会引发一些麻烦,比如下面这段代码,性能就很差。 

 

 long t1 = System.currentTimeMillis();
 Long sum = 0L;
 for (int i = 0; i < Integer.MAX_VALUE; i++) {
       sum += i;
   }
  long t2 = System.currentTimeMillis();
        
  System.out.println(t2 - t1);//运行时间6891ms

  因为sum是Long类型,而i为int类型,在执行sum += i 的时候,会先把i强转为long类型,然后在把sum拆箱为long类型进行相加操作,之后在自动装箱为Long类型赋值给sum

把sum换成long类型后,结果如下:

long t1 = System.currentTimeMillis();
long sum = 0L;
for (int i = 0; i < Integer.MAX_VALUE; i++) {
      sum += i;
   }
long t2 = System.currentTimeMillis();

 System.out.println(t2 - t1);//5ms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值