Integer源码分析

一.源码分析

以下博客讲得很详细:
https://blog.csdn.net/wangyangzhizhou/article/details/77196626

二.涉及到的面试点

自动拆装箱和缓存机制

1.1.概念

自动装箱:java自动将基本类型转换成其对应的包装器类型,比如将int转换成Integer对象

自动拆箱:java自动将包装器类型转换成其对应的基本类型,比如将Integer对象转换成int

以下为基本类型与其对应的包装器类型图:

在这里插入图片描述

1.2.示例

以下代码为自动拆装箱的示例:

	//手动装箱
	Integer i = new Integer(1);
	
	//自动装箱
	Integer i2 = 1;
	
	//手动拆箱
	int j = i.intValue();
	
	//自动装箱
	int j2 = i;

现在通过其编译成的class文件,看是怎么个自动拆装箱法?

//手动装箱
Integer localInteger1 = new Integer(1);
//自动装箱
Integer localInteger2 = Integer.valueOf(1);
//手动拆箱
int i = localInteger1.intValue();
//自动装箱
int j = localInteger1.intValue();

由上面class文件可见,自动装箱其实是调用Integer类的valueOf方法;而自动拆箱则调用了Integer类的intValue方法。

intValue的源码比较简单:

	public int intValue() {
    	return value;
    }

接下来看一下valueOf的源码:

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    //如果int值处于-128至127(默认)之间,调用静态内部类IntegerCache对应的缓存
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

//Integer静态内部类IntegerCache源码
    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;
        //启动JVM时通过-Djava.lang.Integer.IntegerCache.high=xxx就可以改变缓存值的最大值
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            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);
        }
        high = h;

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

    private IntegerCache() {}
}

由此可见只要Integer的值处于-128至127(默认),将从其静态内部类IntegerCache的cache数组中取缓存值。

1.3.自动拆装中运用的缓存机制
     Integer i1 = 127;
     Integer i2 = 127;
     Integer i3 = 128;
     Integer i4 = 128;
     System.out.println(i1==i2);  //true
     System.out.println(i3==i4);  //false

通过上面的代码,可以知道当Integer的值处于-128至127时,i1==i2为true,由此验证此时取自缓存。
由于自动拆装箱在代码中经常运用,缓存机制可以提高效率。但装箱操作会创建对象,消耗内存,应尽量避免此操作。

猜你喜欢

转载自blog.csdn.net/sunjian1122/article/details/84202346