首先看一段代码(使用JDK 5),如下:

  1. public class Hello
  2. {
  3. public static void main(String[] args)
  4. {
  5. int a = 1000, b = 1000;
  6. System.out.println(a == b);
  7. Integer c = 1000, d = 1000;
  8. System.out.println(c == d);
  9. Integer e = 100, f = 100;
  10. System.out.println(e == f);
  11. }
  12. }

输出结果:

  1. true
  2. false
  3. true

The JavaLanguage Specification, 3rd Edition 写道:

  1. 为了节省内存,对于下列包装对象的两个实例,当它们的基本值相同时,他们总是==:
  2. Boolean
  3. Byte
  4. Character, \u0000 - \u007f(7f是十进制的127)
  5. Integer, -128 — 127

查看jdk源码,如下:

  1. /**
  2. * Cache to support the object identity semantics of autoboxing for values between
  3. * -128 and 127 (inclusive) as required by JLS.
  4. *
  5. * The cache is initialized on first usage. During VM initialization the
  6. * getAndRemoveCacheProperties method may be used to get and remove any system
  7. * properites that configure the cache size. At this time, the size of the
  8. * cache may be controlled by the vm option -XX:AutoBoxCacheMax=<size>.
  9. */
  10. // value of java.lang.Integer.IntegerCache.high property (obtained during VM init)
  11. private static String integerCacheHighPropValue;
  12. static void getAndRemoveCacheProperties() {
  13. if (!sun.misc.VM.isBooted()) {
  14. Properties props = System.getProperties();
  15. integerCacheHighPropValue =
  16. (String)props.remove("java.lang.Integer.IntegerCache.high");
  17. if (integerCacheHighPropValue != null)
  18. System.setProperties(props);  // remove from system props
  19. }
  20. }
  21. private static class IntegerCache {
  22. static final int high;
  23. static final Integer cache[];
  24. static {
  25. final int low = -128;
  26. // high value may be configured by property
  27. int h = 127;
  28. if (integerCacheHighPropValue != null) {
  29. // Use Long.decode here to avoid invoking methods that
  30. // require Integer's autoboxing cache to be initialized
  31. int i = Long.decode(integerCacheHighPropValue).intValue();
  32. i = Math.max(i, 127);
  33. // Maximum array size is Integer.MAX_VALUE
  34. h = Math.min(i, Integer.MAX_VALUE - -low);
  35. }
  36. high = h;
  37. cache = new Integer[(high - low) + 1];
  38. int j = low;
  39. for(int k = 0; k < cache.length; k++) //缓存区间数据
  40. cache[k] = new Integer(j++);
  41. }
  42. private IntegerCache() {}
  43. }
  44. /**
  45. * Returns a <tt>Integer</tt> instance representing the specified
  46. * <tt>int</tt> value.
  47. * If a new <tt>Integer</tt> instance is not required, this method
  48. * should generally be used in preference to the constructor
  49. * {@link #Integer(int)}, as this method is likely to yield
  50. * significantly better space and time performance by caching
  51. * frequently requested values.
  52. *
  53. * @param  i an <code>int</code> value.
  54. * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
  55. * @since  1.5
  56. */
  57. public static Integer valueOf(int i) {
  58. if(i >= -128 && i <= IntegerCache.high)
  59. return IntegerCache.cache[i + 128];
  60. else
  61. return new Integer(i);
  62. }

这儿的IntegerCache有一个静态的Integer数组,在类加载时就将-128 到 127 的Integer对象创建了,并保存在cache数组中,一旦程序调用valueOf 方法,如果i的值是在-128 到 127 之间就直接在cache缓存数组中去取Integer对象。

再看其它的包装器:

  • Boolean:(全部缓存)
  • Byte:(全部缓存)
  • Character(<= 127缓存)
  • Short(-128 — 127缓存)
  • Long(-128 — 127缓存)
  • Float(没有缓存)
  • Doulbe(没有缓存)

同样对于垃圾回收器来说:

  1. Integer i = 100;
  2. i = null;//will not make any object available for GC at all.

这里的代码不会有对象符合垃圾回收器的条件,这儿的i虽然被赋予null,但它之前指向的是cache中的Integer对象,而cache没有被赋null,所以Integer(100)这个对象还是存在。

而如果i大于127或小于-128则它所指向的对象将符合垃圾回收的条件:

  1. Integer i = 10000;
  2. i = null;//will make the newly created Integer object available for GC.

最新文章

  1. AJAX应用小案例
  2. html 中自动换行的实现方式
  3. 学习ASP.NET MVC(九)——“Code First Migrations ”工具使用示例
  4. iwebshop 订单存库修改为下单件库存
  5. [QualityCenter]设置工作流脚本-新建缺陷时描述字段模板设置
  6. Channel 笔记本项目 (门户客户端(介绍1) 和 wp7客户端)
  7. 玩具装箱 bzoj1010 斜率优化
  8. Strider SSH Deploy配置
  9. python学习之html从0开始(二)
  10. C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类
  11. (转)asp.net中Literal与label的区别
  12. 【树莓派】Linux自动配置IP
  13. SSM-SpringMVC-14:SpringMVC中大话注解式开发基础--呕心沥血版
  14. Mac OS Sierra安装源不能设置任何来源(anywhere)
  15. springboot配置文件(.yml)中自定义属性值并在controller里面获取
  16. 定时调度篇之Quartz.Net详解(被替换)
  17. [转] Shell编程之数组使用
  18. BZOJ1192 [HNOI2006]鬼谷子的钱袋 数学推理
  19. { MySQL基础数据类型}一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型
  20. Python Json模块中dumps、loads、dump、load函数介绍

热门文章

  1. 记录下MD5加密遇到的坑
  2. LeetCode OJ:Recover Binary Search Tree(恢复二叉搜索树)
  3. LeetCode OJ:Combination Sum (组合之和)
  4. 微信oauth2验证
  5. PostgreSQL.conf文件配置详解[转]
  6. Django 常见的异常
  7. VC6工程因行尾格式无法转换到VS2015
  8. beego数据输出
  9. MpVue开发之框架的搭建
  10. 浅析Python中bytes和str区别