首先看一段代码(使用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.

java Integer类的缓存(转)的更多相关文章

  1. Java Integer类的缓存

    首先看一段代码(使用JDK 5),如下: public class Hello { public static void main(String[] args) { int a = 1000, b = ...

  2. Integer类的缓存机制

    一.Integer类的缓存机制 我们查看Integer的源码,就会发现里面有个静态内部类. public static Integer valueOf(int i) { assert IntegerC ...

  3. Integer类之缓存

    在开始详细的说明问题之前,我们先看一段代码 1 public static void compare1(){ 2 Integer i1 = 127, i2 = 127, i3 = 128, i4 = ...

  4. Java—Integer类

    Integer类 Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 该类提供了多个方法,能在 int 类型和 String 类型之间 ...

  5. java Integer类以及拆箱和装箱

    package com.ilaw.boson.controller; public class Demo { public static void main(String[] args) { Inte ...

  6. Java Integer类分析

    public static final int   MIN_VALUE = 0x80000000;  -2^31 public static final int   MAX_VALUE = 0x7ff ...

  7. 【转】理解Java Integer的缓存策略

    本文将介绍 Java 中 Integer 缓存的相关知识.这是 Java 5 中引入的一个有助于节省内存.提高性能的特性.首先看一个使用 Integer 的示例代码,展示了 Integer 的缓存行为 ...

  8. 理解Java Integer的缓存策略

    转载自http://www.importnew.com/18884.html 本文将介绍 Java 中 Integer 缓存的相关知识.这是 Java 5 中引入的一个有助于节省内存.提高性能的特性. ...

  9. 理解Java Integer的缓存策略【转】

    本文由 ImportNew - 挖坑的张师傅 翻译自 javapapers.欢迎加入翻译小组.转载请见文末要求. 本文将介绍 Java 中 Integer 缓存的相关知识.这是 Java 5 中引入的 ...

随机推荐

  1. LeetCode OJ:Pascal's TriangleII(帕斯卡三角II)

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...

  2. 条款11:记得在operator=中处理自赋值的情况。

    本来的版本是这样的: Widget & Widget::operator=(Widget rhs) { delete pb;//这里可能直接将rhs的pb删除了 pb = new (*rhs. ...

  3. 《转》浅谈EJB

    ejb一直是一个让我很纠结的技术,虽然ejb作为sun推荐的最佳实践,在sun的J2EE教程中,推荐jsp和servlet作为view层,ejb作为业务逻辑层. 上述就是J2EE教程讲J2EE体系中J ...

  4. New Concept English three (30)

    27W/m 32 words the death of ghost For years, villagers believed that Endley Farm was hunted. The far ...

  5. 《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop

    no-loop 定义当前的规则是否不允许多次循环执行,默认是 false,也就是当前的规则只要满足条件,可以无限次执行.什么情况下会出现规则被多次重复执行呢?下面看一个实例: package com. ...

  6. Electron 使用 Webpack2 预编译 Electron 和 Browser targets

    Electron 使用 Webpack2 预编译 Electron 和 Browser targets 前一篇文章说了说怎样使用 Webpack2 预编译 Electron 应用,但是有时候我们希望使 ...

  7. TensorFlow官网访问不了

    相信很多搞深度学习的小伙伴最近都为访问不了 TensorFlow官网 而苦恼吧!虽然网上也给出了一些方法,但是却缺少一个很重要的步骤.接下来,我就给大家讲解一个完整的过程,大牛绕过. 1.更改Host ...

  8. 从无到有开发自己的Wordpress博客主题---运行环境准备

    目前只做本地开发,只在本地搭建测试环境,最后会在服务器的CentOS中搭建正式环境,我使用的是Mac,最简单的办法就是安装MAMP. 1.下载并安装MAMP 下载地址:https://www.mamp ...

  9. kali视频学习(6-10)

    第三周 kali视频(6-10)学习 6.信息搜集之主机探测 7.信息搜集之主机扫描(nmap使用) 8.信息搜集之指纹识别 9.信息搜集之协议分析 10.漏洞分析之OpenVAS安装 6.信息搜集之 ...

  10. Tornado输出和响应头

    1.输出 再来看看输出`write`,实际上,`write`并没有直接把数据返回给前端,而是先写到缓存区,函数结束之后才会返回到前端,我们验证如下 class FlushHandler(tornado ...