Java 自动装箱与拆箱的实现原理 您所在的位置:网站首页 装箱和拆箱的意义 Java 自动装箱与拆箱的实现原理

Java 自动装箱与拆箱的实现原理

2023-03-20 04:39| 来源: 网络整理| 查看: 265

什么是自动装箱和拆箱

自动装箱就是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 实验室设备网 版权所有