Java中整形的缓存机制
2016-03-13 11:34
513 查看
本文将介绍一下Java中关于Integer的缓存知识,首先看一下下面的代码,猜测一下会输出什么结果。
对于上述代码,由于运用的是“==”,而java中“==”比较的是两个引用而非引用的值,所以大家普遍认为两个输出都会是false,然而运行结果则为true,false。
当然,Java中除了对Integer有缓存机制外,其中还有ByteCache,ShortCache,LongCache,CharacterCache分别对其对应的类型进行缓存,其中Byte,Short,Long的缓存范围都为-128——127,Character为0——127。特别要注意的是这几个缓存中,只有Integer的缓存上限(high)可以设置,其他的都不能进行设置,为固定范围。
/** * Created by lanxing on 16-3-13. */ public class IntegerCache { public static void main(String[] args){ Integer integer1 = 3; Integer integer2 = 3; System.out.println(integer1 == integer2); Integer integer3 = 300; Integer integer4 = 300; System.out.println(integer3 == integer4); } }
对于上述代码,由于运用的是“==”,而java中“==”比较的是两个引用而非引用的值,所以大家普遍认为两个输出都会是false,然而运行结果则为true,false。
Java中关于Integer缓存机制的介绍:
由于上述代码进行了自动装包操作,查看Java的Integer源码的valueOf(int)代码如下:/** * Returns an {@code Integer} instance representing the specified * {@code int} value. If a new {@code Integer} 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. * * 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); }由上述源码可知,当装包对象在IntegerCache.low到Integer.high之间时,结果直接从IntegerCache中获取,否则直接创造一个实例。下面为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[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = 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 j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; }分析上述源码可知,IntegerCache的low为-128,而high可以通过"-XX:AutoBoxCacheMax=<size>"指定,默认的high为127。当设置high之后,high的实际值取默认值和设置值中最大值,同时小于或等于0X7FFFFF7E。然后将low到high之间的数值存放到cache中。由于该类及方法都是静态的,因此在首次使用时会执行该操作,当需要对low到high之间的数字进行装包操作时,则直接返回IntegerCache.cache中现成的引用。所以上述对基本类型3进行装包时返回同一个引用,故结果输出true。
当然,Java中除了对Integer有缓存机制外,其中还有ByteCache,ShortCache,LongCache,CharacterCache分别对其对应的类型进行缓存,其中Byte,Short,Long的缓存范围都为-128——127,Character为0——127。特别要注意的是这几个缓存中,只有Integer的缓存上限(high)可以设置,其他的都不能进行设置,为固定范围。
相关文章推荐
- 欧几里德公式java编程例子
- JavaSE知识集锦(2)序列化与反序列化
- java读取properties 配置文件信息
- selenium2 java版
- Java Classloader机制
- JavaScrict中的断言调试
- struts 2.1.8.1的sx:datetimepicker标签出现NaN错误的原因和解决办法
- Leetcode: 190. Reverse Bits(JAVA)
- Java多线程:线程状态
- Java 回顾笔记_多线程_线程通讯1
- 白话Spring(中级篇)---MVC
- 【Struts2学习笔记(1)】Struts2中Action名称的搜索顺序和多个Action共享一个视图--全局result配置
- AndroidStudio快捷键(Eclipse转AndroidStudio)
- 3Sum Closest | Java最短代码实现
- [JAVA · 初级]:10.如何更好的理解多态
- Leetcode:223. Rectangle Area(JAVA)
- spring 中属性scope 的prototype(有状态)和singleton(无状态)
- 【JAVA】38、构造方法的定义
- 超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享
- 排序算法总结 java实现