城镇建设周刊网站,wordpress推荐链接,食品包装设计公司排名,wordpress更改logoJava的Integer缓冲池#xff1f;
Integer 缓存池主要为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围#xff0c;因此缓存这些对象可以减少内存分配和垃圾回收的负担#xff0c;提升性能。
在-128到 127范围内的 Integer 对象会被缓存和复用…Java的Integer缓冲池
Integer 缓存池主要为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围因此缓存这些对象可以减少内存分配和垃圾回收的负担提升性能。
在-128到 127范围内的 Integer 对象会被缓存和复用。
原理
int 在自动装箱的时候会调用Integer.valueOf进而用到了 IntegerCache。
HotSpotIntrinsicCandidate
public static Integer value0f(int i){if(i IntegerCache.low i IntegerCache.high) //如果传入的int值在缓存范围内则直接从缓存中返回Integer对象return IntegerCache.cache[i(-IntegerCache.low)];return new Integer(i); //否则创建新的Integer对象
}
private static class IntegerCache{static final int low-128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h 127;String integerCacheHighPropValue VM.getSavedProperty( key:java.lang.Integer.IntegerCache.high);if(integerCacheHighPropValue ! null){try {int i parseInt(integerCacheHighPropValue);i Math.max(i127);// Maximum array size is Integer.MAX_VALUEh 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 i low;for(int k0;k cache.length; k) //遍历创建-128-127的所有对象cache[k] new Integer(i);assert IntegerCache.high 127;}private IntegerCache(){}
} 所以这里还有个面试题就是为啥 Integer 127 之内的相等而超过 127 的就不等了 因为小于等于127的 Integer 对象是从同一个缓存池中获取的它们指向的是相同的对象实例所以它们的引用相等
不仅 Integer 有Long 同样有一个缓存池不过范围是写死的 -128 到 127不能通过JVM参数进行调整
HotSpotIntrinsicCandidate
public static Long value0f(long l){final int offset 128;if(l -128 l 127){ // will cachereturn LongCache.cache[(int)l offsetl];}return new Long(l);
} 总结 ByteShortIntegerLong这4种包装类默认创建了数值[-128,127]的相应类型的缓存数据 Character 创建了数值在 [0,127]范围的缓存数据 Boolean 直接返回 True or False Float 和 Double 没有缓存数据毕竟是小数能存的数太多了