首先看一段代码(使用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. Flask 的整体流程

    Flask 的整体流程 封装 requestContext 对象, full_dispatch_request(视图函数 执行), response返回 从app.run() 开始 -->> ...

  2. java事务(二)——本地事务

    本地事务 事务类型 事务可以分为本地事务和分布式事务两种类型.这两种事务类型是根据访问并更新的数据资源的多少来进行区分的.本地事务是在单个数据源上进行数据的访问和更新,而分布式事务是跨越多个数据源来进 ...

  3. Unity在协程(Coroutines)内开启线程(Threading )

    孙广东  2017.6.13 http://blog.csdn.NET/u010019717 为什么要在协程中开启线程, 因为很多时候我们是需要线程执行完成后回到主线程的.然后主线程在继续执行后续的操 ...

  4. jQuery attr 与 prop 区别最简单分析

    比较经典的解释: 在处理html元素本身就带有的固有属性时,使用prop方法,对于html元素中,我们自己定义的dom属性时,使用attr方法. 而咱自己的理解是: attr会忠实的获取设置dom标签 ...

  5. IntelliJ IDEA中使用Git

    IntelliJ IDEA下使用Git IntelliJ IDEA下配置Git:git clone.git checkout.git diff.git log.git commit.git push. ...

  6. Weex 解析(二)—— NativeBridge

    (本篇幅主要讲解Weex 中iOS native与js交互实现) 大纲: weex 总框架预览 iOS NativeBridge总设计原理 一.weex 总框架预览 在写NativeBridge 总设 ...

  7. git撤销各种状态下的操作

    使用Git时会出现各种各样的问题,下面是几种情况下怎么反悔的操作 一,未加入缓存区,撤销文件修改 git checkout -- file 二,已加入缓存区,撤销文件提交 git reset HEAD ...

  8. 【LeetCode】汇总

    此贴为汇总贴 673. Number of Longest Increasing Subsequence 075. Sort Colors 009. Palindrome Number 008. St ...

  9. Django Rest Framework - Could not resolve URL for hyperlinked relationship using view name “user-detail”

    要把跟当前表相关的viewset定义出来 http://stackoverflow.com/questions/20550598/django-rest-framework-could-not-res ...

  10. 避免Android内存泄露

    摘自:http://blog.csdn.net/xyz_lmn/article/details/7108011 Android的应用被限制为最多占用16m的内存,至少在T-Mobile G1上是这样的 ...