java Integer类的缓存(转)
首先看一段代码(使用JDK 5),如下:
- public class Hello
 - {
 - public static void main(String[] args)
 - {
 - int a = 1000, b = 1000;
 - System.out.println(a == b);
 - Integer c = 1000, d = 1000;
 - System.out.println(c == d);
 - Integer e = 100, f = 100;
 - System.out.println(e == f);
 - }
 - }
 
输出结果:
- true
 - false
 - true
 
The JavaLanguage 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 Integer's 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.
 
java Integer类的缓存(转)的更多相关文章
- Java Integer类的缓存
		
首先看一段代码(使用JDK 5),如下: public class Hello { public static void main(String[] args) { int a = 1000, b = ...
 - Integer类的缓存机制
		
一.Integer类的缓存机制 我们查看Integer的源码,就会发现里面有个静态内部类. public static Integer valueOf(int i) { assert IntegerC ...
 - Integer类之缓存
		
在开始详细的说明问题之前,我们先看一段代码 1 public static void compare1(){ 2 Integer i1 = 127, i2 = 127, i3 = 128, i4 = ...
 - Java—Integer类
		
Integer类 Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 该类提供了多个方法,能在 int 类型和 String 类型之间 ...
 - java Integer类以及拆箱和装箱
		
package com.ilaw.boson.controller; public class Demo { public static void main(String[] args) { Inte ...
 - Java Integer类分析
		
public static final int MIN_VALUE = 0x80000000; -2^31 public static final int MAX_VALUE = 0x7ff ...
 - 【转】理解Java Integer的缓存策略
		
本文将介绍 Java 中 Integer 缓存的相关知识.这是 Java 5 中引入的一个有助于节省内存.提高性能的特性.首先看一个使用 Integer 的示例代码,展示了 Integer 的缓存行为 ...
 - 理解Java Integer的缓存策略
		
转载自http://www.importnew.com/18884.html 本文将介绍 Java 中 Integer 缓存的相关知识.这是 Java 5 中引入的一个有助于节省内存.提高性能的特性. ...
 - 理解Java Integer的缓存策略【转】
		
本文由 ImportNew - 挖坑的张师傅 翻译自 javapapers.欢迎加入翻译小组.转载请见文末要求. 本文将介绍 Java 中 Integer 缓存的相关知识.这是 Java 5 中引入的 ...
 
随机推荐
- LeetCode OJ:Word Search(单词查找)
			
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...
 - VS字体颜色配置
 - main(argc,argv[])
			
每个C语言程序都必须有一个称为main()的函数,作为程序启动的起点.当执行程序时,命令行参数(command-line argument)(由shell逐一解析)通过两个入参提供给main()函数. ...
 - Mark: admob for delphi xe4 integrated 80% -done!-95%  to do more test
			
Todo: admob 整合. Integrated Admob with Delphi xe4. 2013-06-28 !done! 2013-07-01 Notice: You should ...
 - linux C使用strerror来追查错误信息
			
最近工作中有个需求:程序将文件进行处理,然后将处理完毕的文件挪走.我用了rename函数来挪动文件,可是在docker化的环境中,文件却无法挪动.不知道什么原因.现在,对程序进行调整,如果rename ...
 - 关于 self = [super init];
			
[plain] view plaincopyprint? - (id)init { self = [super init]; // Call a designated initializer here ...
 - Java基础总结大全
			
一.基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平台,jvm不是跨平台的. J ...
 - Linq:从XML获取数据
			
实体类 public class Customer { public string CustomerID { get; set; } public string CompanyName { get; ...
 - iTunes文件共享
			
在Info.plist文件中添加UIFileSharingEnabled键,并将键值设置为YES.将您希望共享的文件放在应用程序的Documents目录.
 - Spring中类型自动装配--byType
			
在Spring中,“类型自动装配”的意思是如果一个bean的数据类型与其它bean属性的数据类型相同,将自动兼容装配它. 例如,一个“persion” bean 公开以“ability”类数据类型作为 ...