Java 自动装箱与拆箱的实现原理 | 您所在的位置:网站首页 › 装箱和拆箱的意义 › Java 自动装箱与拆箱的实现原理 |
什么是自动装箱和拆箱 自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。原始类型byte, short, char, int, long, float, double 和 boolean 对应的封装类为Byte, Short, Character, Integer, Long, Float, Double, Boolean。 下面例子是自动装箱和拆箱带来的疑惑 public class Test { public static void main(String[] args) { test(); } public static void test() { int i = 40; int i0 = 40; Integer i1 = 40; Integer i2 = 40; Integer i3 = 0; Integer i4 = new Integer(40); Integer i5 = new Integer(40); Integer i6 = new Integer(0); Double d1=1.0; Double d2=1.0; System.out.println("i=i0\t" + (i == i0)); System.out.println("i1=i2\t" + (i1 == i2)); System.out.println("i1=i2+i3\t" + (i1 == i2 + i3)); System.out.println("i4=i5\t" + (i4 == i5)); System.out.println("i4=i5+i6\t" + (i4 == i5 + i6)); System.out.println("d1=d2\t" + (d1==d2)); System.out.println(); } }请看下面的输出结果跟你预期的一样吗? 输出的结果: i=i0 true i1=i2 true i1=i2+i3 true i4=i5 false i4=i5+i6 true d1=d2 false 为什么会这样?带着疑问继续往下看。 自动装箱和拆箱的原理自动装箱时编译器调用valueOf将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值。 明白自动装箱和拆箱的原理后,我们带着上面的疑问进行分析下Integer的自动装箱的实现源码。如下: public static Integer valueOf(int i) { //判断i是否在-128和127之间,存在则从IntegerCache中获取包装类的实例,否则new一个新实例 if (i >= IntegerCache.low && i = 127; } private IntegerCache() {} }Integer i1 = 40; 自动装箱,相当于调用了Integer.valueOf(40);方法。 首先判断i值是否在-128和127之间,如果在-128和127之间则直接从IntegerCache.cache缓存中获取指定数字的包装类;不存在则new出一个新的包装类。 IntegerCache内部实现了一个Integer的静态常量数组,在类加载的时候,执行static静态块进行初始化-128到127之间的Integer对象,存放到cache数组中。cache属于常量,存放在java的方法区中。 如果你不了解方法区请点击这里查看JVM内存模型 接着看下面是java8种基本类型的自动装箱代码实现。如下: //boolean原生类型自动装箱成Boolean public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); } //byte原生类型自动装箱成Byte public static Byte valueOf(byte b) { final int offset = 128; return ByteCache.cache[(int)b + offset]; } //byte原生类型自动装箱成Byte public static Short valueOf(short s) { final int offset = 128; int sAsInt = s; if (sAsInt >= -128 && sAsInt |
CopyRight 2018-2019 实验室设备网 版权所有 |