Java中自动拆箱与自动装箱的深入浅析

  介绍

这篇文章运用简单易懂的例子给大家介绍Java中自动拆箱与自动装箱的深入浅析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

<强>包装器

有些时候,我们需要把类似于int,双这样的基本数据类型转成对象,于是设计者就给每一个基本数据类型都配置了一个对应的类,这些类被称为包装器。

包装器整体来说分为四大种:

    <李>数字,数字类派生出了整数,翻倍,长,浮动,短,字节这六个小类分别代表了int,翻倍,长,浮动,短,字节这六种基本数据类型。 <李>字符,对应的基本数据类型是char。 <李>空白,对应的是关键字无效,这个类我们会经常在反射中看到,用于表示方法的返回值是无效的,这里不再赘述,后面反射章节详细讲解。 <李>布尔,对应的是基本数据类型布尔。
      李,

要记住下面两点包装器的特性:

包装器是不可变的,一旦构造了包装器,就不允许更改包装在其中的值。

    <李>包装器是最后定义的,不允许定义它的子类。
      李,

<>强自动装箱和自动拆箱

ArrayList,列表=new ArrayList<的在();      list.add (3);      int x=list.get (0);

<>强自动装箱

当我们添加int值到一个集合元素全部是整数的集合中去时候,这个过程发生了什么?

list.add (3);//实际上面的代码会被编译器给自动的变成下面的这个代码   list.add (Integer.valueOf (3)

编译器在其中所作的这个事情就叫做自动装箱。

<>强自动拆箱

当我们取出一个集合中的元素并将这个元素赋给一个int类型的值的时候,这其中又发生了什么呢?

 int x=list.get (0);//实际上面的代码会被编译器给自动的变成下面的这个代码
  int x=list.get (0) .intValue (); 

编译器这其中所作的这个事情就叫做自动拆箱

<>强自动装箱和自动拆箱中的坑

整数i1=100;
  整数i2=100;
  整数i3=300;
  整数预告=300;
  
  system . out。println (i1==i2);
  system . out。println (i3==预告);

这是一道经典的面试题,打印出来的结果是:


为什么会发生这样的事情,我们记得自动装箱的时候会自动调用整数的的方法,我们现在来看一下这个方法的源码:

公共静态整数返回对象的值(int i) {
  如果我在=IntegerCache。低,,我& lt;=IntegerCache.high)
  IntegerCache返回。缓存(i + (-IntegerCache.low));
  返回新的整数(i);
  }

而这个IntegerCache是什么呢?

私有静态类IntegerCache {
  静态最终int低=-128;
  静态最终int高;
  最终的静态整数缓存[];
  
  静态{//高价值的可配置属性
  int h=127;
  字符串integerCacheHighPropValue=https://www.yisu.com/zixun/sun.misc.VM.getSavedProperty (“java.lang.Integer.IntegerCache.high”);
  如果(integerCacheHighPropValue !=null) {
  尝试{
  int i=方法(integerCacheHighPropValue);
  i=数学。马克斯(我127);//最大数组大小是Integer.MAX_VALUE
  h=数学。分钟(我,整数。MAX_VALUE -(低)1);
  }捕捉(NumberFormatException nfe) {//如果属性不能被解析成int,忽略它。
  }
  }
  高=h;
  
  缓存=new Integer[(高-低)+ 1];
  int j=低;
  for (int k=0;k =127;
  }
  
  私人IntegerCache () {}
  }

从这2段代码可以看的出,在通过的方法创建整数对象的时候,如果数值在[-128127]之间,便返回指向IntegerCache。缓存中已经存在的对象的引用,否则创建一个新的整数对象。

上面的代码中i1和i2的数值为100,因此会直接从缓存中取已经存在的对象,所以i1和i2指向的是同一个对象,而i3和预告则是分别指向不同的对象。

这样我们就不难理解为什么一个是假的,一个是真实的了。

其他的包装器的的方法也有不同的实现和不同的范围,具体的我们会在源码深度解析专栏来分析,敬请期待~

关于Java中自动拆箱与自动装箱的深入浅析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。

Java中自动拆箱与自动装箱的深入浅析