这篇文章运用简单易懂的例子给大家介绍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中自动拆箱与自动装箱的深入浅析