自动装箱、拆箱

package day1;

public class Change {
  public static void main(String[] args) {
     int data1=100;
     int data2=100;
     Integer integer1=new Integer(data1);  //将int类型打包成Integer类型
     Integer integer2=new Integer(data2);
     System.out.println(data1/3);         //基本类型的算法
     System.out.println(integer1.doubleValue()/3);  //包装器类型调用方法转换为double类型
     System.out.println(integer1.compareTo(integer2));
              }
}

1.打包基本类型

java中的基本类型要想像对象一样使用,需要被打包器打包,打包器有Long、Integer、Double、Float、Boolean、Byte。

上面的打包器对象integer1调用doubleValue()方法,变为double类型,运算结果为3.3333333333.

2.自动装箱与拆箱

jdk1.5之后,为了简洁代码,提供了自动装箱和拆箱功能。

Integer i=10;

自动将int类型打包为Integer类型。

int t=i;

自定将被打包的Integer类型的int类型值赋给t。

在运算时也会自动进行自动装箱和拆箱。

Integer i=10;
System.out.println(i+9);//运算时完成自动拆箱。

3.装箱内幕

Integer i=1;

编译器在编译期间会自动将代码扩展为:Integer i=Integer.valueOf(1);

我们查看Integer的valueOf()方法的源码:

  public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

如果传入的值在IntegerCache.low 到IntegerCache.high之间,那么Integer对象i的值存在缓存中,如果后面传入相同的值,那么会看看缓存中有没有这个值,有就会取这个值。

如果超出这个范围(-128-127),就会在内存中创建一个新的对象。

package day1;

public class Change {
  public static void main(String[] args) {
    
     Integer integer1=100;
     Integer integer2=100;
     Integer integer3=200;
     Integer integer4=200;
     System.out.println(integer1==integer2);
     System.out.println(integer3==integer4);
              }
}

结果为:true

               false

 

posted @ 2018-07-20 23:06  执棋手  阅读(142)  评论(0编辑  收藏  举报