首页 > 开发 > Java > 正文

Integer IntegerCache源码阅读

2024-07-13 10:16:25
字体:
来源:转载
供稿:网友

先看一段测试结果:

/*public static void main(String[] args) {    Integer a = 128, b = 128;    Integer c = 127, d = 127;    System.out.println(a == b);//false    System.out.println(c == d);//true  }*/    /*public static void main(String[] args) {    Integer int1 = Integer.valueOf("100");    Integer int2 = Integer.valueOf("100");    System.out.println(int1 == int2);//true  }*/  public static void main(String[] args) {    Integer int1 = Integer.valueOf("300");    Integer int2 = Integer.valueOf("300");    System.out.println(int1 == int2);//false  }

JDK的源码如下:

public static Integer valueOf(String s) throws NumberFormatException {    return Integer.valueOf(parseInt(s, 10));  }public static Integer valueOf(int i) {    if (i >= IntegerCache.low && i <= IntegerCache.high)      return IntegerCache.cache[i + (-IntegerCache.low)];    return new Integer(i);  }

发现里面另有玄机,多了个IntegerCache类:

private static class IntegerCache {    static final int low = -128;    static final int high;    static final Integer cache[];    static {      // high value may be configured by property      int h = 127;      String integerCacheHighPropValue =        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");      if (integerCacheHighPropValue != null) {        try {          int i = parseInt(integerCacheHighPropValue);          i = Math.max(i, 127);          // Maximum array size is Integer.MAX_VALUE          h = Math.min(i, Integer.MAX_VALUE - (-low) -1);        } catch( NumberFormatException nfe) {          // If the property cannot be parsed into an int, ignore it.        }      }      high = h;      cache = new Integer[(high - low) + 1];      int j = low;      for(int k = 0; k < cache.length; k++)        cache[k] = new Integer(j++);      // range [-128, 127] must be interned (JLS7 5.1.7)      assert IntegerCache.high >= 127;    }    private IntegerCache() {}  }

原来Integer把-128到127(可调)的整数都提前实例化了。

这就解释了答案,原来你不管创建多少个这个范围内的Integer用ValueOf出来的都是同一个对象。

但是为什么JDK要这么多此一举呢? 我们仔细想想, 淘宝的商品大多数都是100以内的价格, 一天后台服务器会new多少个这个的Integer, 用了IntegerCache,就减少了new的时间也就提升了效率。同时JDK还提供cache中high值得可配置,

这无疑提高了灵活性,方便对JVM进行优化。

总结

以上就是本文关于Integer IntegerCache源码阅读的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表