温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Integer.ValueOf()的用法

发布时间:2020-07-28 14:53:00 来源:亿速云 阅读:172 作者:小猪 栏目:编程语言

这篇文章主要讲解了Java Integer.ValueOf()的用法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

Java Integer.ValueOf()的用法

 这道题有的人或许做过,也可能选对,但是这其中的道理你却不一定理解,在这里大牛走过,小白留下一起学习。

Java Integer.ValueOf()的用法

先来分析选型A,Integer i01 = 59,是一个装箱的过程,在进行i01 == i02的比较过程中,因为右边是整型,发生了拆箱的动作,所以进行了值得比较,所以返回true。

在这里拿出Integer a = 59,Integer b = 59,这种又会出现什么状况呢,如果按照装箱和拆箱来看就是true,如果按照对象来看,就是false,在你举棋不定得时候你就应该看看源码了。

/**
   * Cache to support the object identity semantics of autoboxing for values between
   * -128 and 127 (inclusive) as required by JLS.
   *
   * The cache is initialized on first usage. The size of the cache
   * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
   * During VM initialization, java.lang.Integer.IntegerCache.high property
   * may be set and saved in the private system properties in the
   * sun.misc.VM class.
   */
 
  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类中的一个静态内部类,其中的静态代码块在类进行加载的时候就进行了-127-128这些数字的创建和保存,将他们的引用全部保存在Cache数组中。

所以当用Integer 声明初始化变量时,会先判断所赋值的大小是否在-128到127之间,若在,则利用静态缓存中的空间并且返回对应cache数组中对应引用,存放到运行栈中,而不再重新开辟内存。

这里你就懂了吧,Integer a = 59,Integer b = 59返回的就是true,Integer a = 300,Integer b = 300在判断完之后就会new出来一个新的对象,所以会返回false。

Java Integer.ValueOf()的用法

我们来分析B选项,我们先来看Value的代码。

* @param i an {@code int} value.
   * @return an {@code Integer} instance representing {@code i}.
   * @since 1.5
   */
  public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
      return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);

和上面的一样,int进去之后首先进行判断,如果在-128-127之间就会返回引用,否则就在堆上new出来对象。所以B选项返回true。

Java Integer.ValueOf()的用法

C选项i03返回的是Cache数组中的引用,而i04返回的是堆上对象的引用,所以返回的是false。

Java Integer.ValueOf()的用法

System.out.println(i02== i04) i02是整型变量,i04是引用,这里又用到了解包,虚拟机会把i04指向的数据拆箱为整型变量再与之比较,所以比较的是数值,59==59,返回true.

看完上述内容,是不是对Java Integer.ValueOf()的用法有进一步的了解,如果还想学习更多内容,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI