Java知识点系列:包装类型的缓存

Java知识点目录

 

先看一个问题

Integer int1 = 100;
Integer int2 = 100;
Integer int3 = 1000;
Integer int4 = 1000;
System.out.println("int1 == int2 :" + (int1 == int2));
System.out.println("int3 == int4 :" + (int3 == int4));

运行结果

这个例子只为了说明引用地址,包装类型相等判断应该用equals

int1 == int2 :true
int3 == int4 :false

 

Integer

以Integer为例,先看IntegerCache的源码。

/**
 * Cache to support the object identity semantics of autoboxing for values between
 * -128 and 127 (inclusive) as required by JLS.
 *
 * The cache is initialized on first usage.  The size of the cache
 * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
 * During VM initialization, java.lang.Integer.IntegerCache.high property
 * may be set and saved in the private system properties in the
 * sun.misc.VM class.
 */

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

根据注释,int类型在自动装箱成包装类型的时候,会使用缓存。创建范围在 -128 到 127 的包装类型时,先在缓存里查找对应的缓存对象,找到的话直接返回使用,未找到时创建一个新对象,并将新对象存到缓存。

-XX:AutoBoxCacheMax=<size> 这个JVM参数可以设置缓存的最大值 high。最小值low总是 -128。

 

其他包装类型

与Integer类似,Byte,Short,Long,Character也有这种缓存机制,其中Byte,Short,Long的缓存范围固定为 -128~127,Character的缓存范围是 \u005Cu0000 到 \u005Cu007F

上一篇:单片机(AT89C51)中断系统详解和中断系统应用实验


下一篇:洛古 P1020 导弹拦截 N^2