Java记录 -76- Integer cache缓存
2015-11-15 14:16
701 查看
Integer cache缓存
下面有一个简单的关于Integer的实例,但出乎预料的是其输出结果:
这是为什么呢?有点不可思议 ...
下面我们通过查看Integer的源代码来分析一下(像这种问题也只能通过源代码来查看分析其原因);
看Integer的valueOf方法,该方法是将int的转变为Integer,但当int值大于-128并小于127时,其必须缓存 must cache,并返回的是IntegerCache的cache数组中的值;
我们在看IntegerCache,该类是Integer的一个内部类,它定义了一个静态的Integer类型的数组,并在静态块中将其循环初始化值;
也就是说,我们利用Integer获得的大于-128并小于127的对象是,返回的都是缓存起来的对象,并没有新生成对象。
public static Integer valueOf(int i)
如果不需要新的 Integer 实例,则通常应优先使用该方法,而不是构造方法
下面有一个简单的关于Integer的实例,但出乎预料的是其输出结果:
public class IntegerTest2 { public static void main(String[] args){ Integer i1 = 100; Integer i2 = 100; System.out.println(i1 == i2); Integer i3 = 200; Integer i4 = 200; System.out.println(i3 == i4); } }上面的实例输出结果为:true 和 false
这是为什么呢?有点不可思议 ...
下面我们通过查看Integer的源代码来分析一下(像这种问题也只能通过源代码来查看分析其原因);
看Integer的valueOf方法,该方法是将int的转变为Integer,但当int值大于-128并小于127时,其必须缓存 must cache,并返回的是IntegerCache的cache数组中的值;
我们在看IntegerCache,该类是Integer的一个内部类,它定义了一个静态的Integer类型的数组,并在静态块中将其循环初始化值;
也就是说,我们利用Integer获得的大于-128并小于127的对象是,返回的都是缓存起来的对象,并没有新生成对象。
public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset]; } return new Integer(i); } private static class IntegerCache { private IntegerCache(){} static final Integer cache[] = new Integer[-(-128) + 127 + 1]; static { for(int i = 0; i < cache.length; i++) cache[i] = new Integer(i - 128); } }JDK的API文档提示:
public static Integer valueOf(int i)
如果不需要新的 Integer 实例,则通常应优先使用该方法,而不是构造方法
Integer(int),因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。
相关文章推荐
- Java命令参数说明
- Java虚拟机参数,增加虚拟机最大内存,在/etc/profile增加如下: export JAVA_OPTS="-Xms9g -Xmx9g"
- Java命令参数说明
- Java虚拟机参数,增加虚拟机最大内存,在/etc/profile增加如下: export JAVA_OPTS="-Xms9g -Xmx9g"
- JDK安装后 没有tools.jar 和dt.jar包的解决办法
- jdk环境变量搭建
- Corba开发之Eclipse环境配置
- SVN之——eclipse中maven项目交付svn忽略配置文件
- Java NIO学习:缓冲区
- java框架
- java框架
- java中多条件与不定条件查询
- Java PinBall 简单弹球小游戏【3】球拍左右移动和场景的监听器
- Java多线程之线程状态
- SpringMVC4.1之Controller层最佳实践
- java名词,关键字
- java名词,关键字
- java 监视器
- SVN之——Eclipse下svn的创建分支/合并/切换使用
- Java多线程同步之Lock用法