将int文字直接分配给Integer引用是自动装箱的示例,其中,由编译器处理到对象转换代码的文字值。
因此,在编译阶段,编译器将转换Integer a = 1000, b = 1000;
为Integer a = Integer.valueOf(1000), b = Integer.valueOf(1000);
。
因此Integer.valueOf()
,实际上是给我们整数对象的方法,如果我们看一下Integer.valueOf()
方法的源代码,我们可以清楚地看到该方法在-128到127(含)范围内缓存整数对象。
/**
*
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range.
*
* @param i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since 1.5
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
因此,如果传递的int文字大于-128且小于127 ,则Integer.valueOf()
该方法从内部返回Integer 对象,而不是创建和返回新的整数对象IntegerCache
。
Java缓存这些整数对象,因为在日常编程中经常使用此整数范围,从而间接节省了一些内存。
当类由于静态块而被加载到内存中时,缓存在第一次使用时被初始化。高速缓存的最大范围可以由-XX:AutoBoxCacheMax
JVM选项控制。
对于整数对象只,类似于Integer.IntegerCache我们也有这缓存行为是不适用ByteCache, ShortCache, LongCache, CharacterCache
的Byte, Short, Long, Character
分别。
您可以在我的文章Java Integer Cache-为什么Integer.valueOf(127)== Integer.valueOf(127)为True上阅读更多内容。