Java Integer类的缓存
2023-09-14 08:56:50 时间
The Java Language Specification, 3rd Edition 写道:
为了节省内存,对于下列包装对象的两个实例,当它们的基本值相同时,他们总是==: Boolean Byte Character, \u0000 - \u007f(7f是十进制的127) Integer, -128 — 127
查看jdk源码,如下:
/** * 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. During VM initialization the * getAndRemoveCacheProperties method may be used to get and remove any system * properites that configure the cache size. At this time, the size of the * cache may be controlled by the vm option -XX:AutoBoxCacheMax= size . // value of java.lang.Integer.IntegerCache.high property (obtained during VM init) private static String integerCacheHighPropValue; static void getAndRemoveCacheProperties() { if (!sun.misc.VM.isBooted()) { Properties props = System.getProperties(); integerCacheHighPropValue = (String)props.remove("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) System.setProperties(props); // remove from system props private static class IntegerCache { static final int high; static final Integer cache[]; static { final int low = -128; // high value may be configured by property int h = 127; if (integerCacheHighPropValue != null) { // Use Long.decode here to avoid invoking methods that // require Integers autoboxing cache to be initialized int i = Long.decode(integerCacheHighPropValue).intValue(); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - -low); 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() {} /** * Returns a tt Integer /tt instance representing the specified * tt int /tt value. * If a new tt Integer /tt instance is not required, this method * should generally be used in preference to the constructor * {@link #Integer(int)}, as this method is likely to yield * significantly better space and time performance by caching * frequently requested values. * @param i an code int /code value. * @return a tt Integer /tt instance representing tt i /tt . * @since 1.5 public static Integer valueOf(int i) { if(i = -128 i = IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }
这儿的IntegerCache有一个静态的Integer数组,在类加载时就将-128 到 127 的Integer对象创建了,并保存在cache数组中,一旦程序调用valueOf 方法,如果i的值是在-128 到 127 之间就直接在cache缓存数组中去取Integer对象。
再看其它的包装器:
Boolean:(全部缓存)
Byte:(全部缓存)
Character( = 127缓存)
Short(-128 — 127缓存)
Long(-128 — 127缓存)
Float(没有缓存)
Doulbe(没有缓存)
Integer i = 100; i = null;//will not make any object available for GC at all.这里的代码不会有对象符合垃圾回收器的条件,这儿的i虽然被赋予null,但它之前指向的是cache中的Integer对象,而cache没有被赋null,所以Integer(100)这个对象还是存在。
而如果i大于127或小于-128则它所指向的对象将符合垃圾回收的条件:
Integer i = 10000; i = null;//will make the newly created Integer object available for GC.
转载地址: http://blog.csdn.net/xiaohai0504/article/details/6885137
相关文章
- java用什么编译器_Java用Java编译「建议收藏」
- java 上传文件接口_Java接口实现文件上传
- java long转日期,long转String[通俗易懂]
- java二维数组试题_Java二维数组及习题总结
- java integer long 转换_long(Long)与int(Integer)之间的转换
- Java–String、StringBuilder及StringBuffer区别及性能对比
- java和c语言哪个简单_Java编程和C语言哪个好学
- MySQL字段类型如何转为java_Java JDBC中,MySQL字段类型到JAVA类型的转换
- Java后台接收参数出现java.lang.Integer cannot be cast to java.lang.Double错误(已解决)[通俗易懂]
- 【说站】java类加载的过程
- java 舆情分析_基于Java实现网络舆情分析系统研究与实现.doc[通俗易懂]
- java 缓存工具类初始化_Java缓存框架
- JAVA代码审计之java反序列化
- JAVA程序员简历模板_Java工程师简历模板
- 客户端建立Redis集群:Java客户端指南(redis集群java)
- Java下使用Redis进行高效缓存优化(Redis缓存java)
- 解锁Java 与 Oracle 的连接之门(java连接oracle)
- 机制实现Redis中Java缓存的过期机制.(redisjava过期)
- 机制使用 Java 和 Redis 实现复杂数据过期机制(redisjava过期)
- Java中使用Redis包实现高效缓存(redis包java)
- 使用Java远程控制Linux 实现简单、高效的服务器管理(java控制linux)
- Linux下快速安装Java开发环境(linux安装java)
- 使用Java去连接MySQL数据库(java jdbc mysql)
- Java解答Oracle使用更轻松的实现方式(oracle写成java)
- 合Java与Oracle联手打造崭新未来(java和oracle联)
- 缓存使用Redis让Java代码更加迅速缓存设置(redis设置java)