自动装箱拆箱

Posted dream-sun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动装箱拆箱相关的知识,希望对你有一定的参考价值。

java中有8种基本数据类型,byte、short、char、int、long、boolean、double、float,在一些数据结构中,是不支持基本数据类型,所以java巨人们又搞出一些基本数据类型的装箱类型Byte、Short、Char、Integer Long Boolean Double Float

看下面的代码例子:

Integer num = 100;
int i = num;//拆箱
int i2 = 100;
Integer num2 = i2; //装箱

实际上 底层原理 在装箱的时候是调的  Integer类的 value0f()函数方法,拆箱调的是intValue()方法;既然了解了装箱和拆箱的 底层调用原理,那么我们就测试几种情况

Integer num = 100;

int i = 100;

Integer num2 = 100;

int i2 = 128

Integer num3=128;

Integer num4 = 128;

System.out.prinlt(num==i);// true

System.out.prinlt(num==num2);//true

System.out.prinlt(num3==i2);//true

System.out.prinlt(num3==num4);//false

从输出结果可以知道,在装箱、拆箱中 基本数据类型和 Integer类型的数值比较 总是相等,因为==对于基本类型 就是比较值

但是,当同样是Integer类型的 时候, 第二行输出的结果和 第四行输出的结果确相反,既然都是调用的Integer的valueOf方法,为什么输出确相反那,那我们就去看一下Integer的源码

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

从valueOf 方法的判断可以看出, 当i不在一个约定的范围之内的时候, 就会new一个新对象,那我们在首先看一下 这个范围是什么

private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];

static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;

cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);

// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}

private IntegerCache() {}
}

 

从标黑加粗的可以看出, 这个范围就是-128, 127],意思就是在-128和127 范围内,不会去 new一个新对象,那么会从哪取的对象那,我们可以深入进入代码看一下

 if (i >= 128 && i <= -127)
    return IntegerCache.cache[i + (-IntegerCache.low)];

可以看去是从IntegerCache(静态内部类)的一个方法中取出来的,看上面标红的代码。可以看出,cache 初始化一个127+128+1=256的一个长度的数组,然后往这个数组中初始化对象,这样 当加载Integer的时候,就会加载静态代码块,加载出 一个长度为256的数组,里面是包含-128 到 127的对象,所以在范围内,就会直接在数组中取出相应的对象,不会创建新的对象。

 

第一次在博客园写博客,后续我会持续下去,吧自己学到的,遇到的坑,都会总结出来。

以上是关于自动装箱拆箱的主要内容,如果未能解决你的问题,请参考以下文章

装箱与拆箱

Java语法糖2:自动装箱和自动拆箱

自动装箱和拆箱的几个细节

java 自动装箱拆箱

转载:详解Java 自动装箱与拆箱的实现原理

11自动拆箱和装箱