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