当前位置: 移动技术网 > IT编程>开发语言>Java > Integer IntegerCache源码阅读

Integer IntegerCache源码阅读

2019年07月19日  | 移动技术网IT编程  | 我要评论

先看一段测试结果:

/*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源码阅读的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网