10
回答
这个程序结果 我没看懂。。。
华为云实践训练营,热门技术免费实践!>>>   

为什么一个true 一个false。。

举报
我今年大三
发帖于2个月前 10回/674阅
共有10个答案 最后回答: 2个月前

IntegerCache   128 -127    自动装箱拆箱 

 

public static Integer valueOf(int i) {  
      assert IntegerCache.high >= 127;  
      if (i >= IntegerCache.low && i <= IntegerCache.high)  
          return IntegerCache.cache[i + (-IntegerCache.low)];  
      return new Integer(i);  
  }  

 

--- 共有 4 条评论 ---
哈斯卡会正解 2个月前 回复
我今年大三 回复 @蜗牛君 : 嗯 我debug过了。。是这样的~学习了。 2个月前 回复
蜗牛君 回复 @我今年大三 : 你的代码 Integer i=100; 自动装箱会用 Interger的valueOf 来给出一个实例 2个月前 回复
我今年大三- - 我的代码 应该没用到valueOf吧。。 2个月前 回复

java基础上有说过啊  超过199  就不能相等   

--- 共有 6 条评论 ---
雨落秋垣 回复 @九块腹肌进先生丶 : 那就是我看错了吧 我还没用过这个 一般不是int 就是string 2个月前 回复
九块腹肌进先生丶 回复 @雨落秋垣 : 怕你是看了本假书吧 哪本书书上说是199了 2个月前 回复
雨落秋垣 回复 @我今年大三 : 不 他们没有骗你 2个月前 回复
我今年大三@雨落秋垣 回复@雨落秋垣 : :laughing: 小哥哥 你的意思是楼下几位哥哥是在骗我咯。 2个月前 回复
雨落秋垣 回复 @我今年大三 : 教科书 我i应该上传到网站上去了 网站https://ceet.xin 在里面的那个SCME视频里面 自己找找看 SCCE是c#的教程 2个月前 回复

引用来自“蜗牛君”的评论

IntegerCache   128 -127    自动装箱拆箱 

 

public static Integer valueOf(int i) {  
      assert IntegerCache.high >= 127;  
      if (i >= IntegerCache.low && i <= IntegerCache.high)  
          return IntegerCache.cache[i + (-IntegerCache.low)];  
      return new Integer(i);  
  }  

 

正解

==比较的是变量存的内存地址,  但是由于Integer的自动装箱机制,-128到127范围内的都是用同一个地址空间。

/**
 * 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() {}
}

在程序默认配置下,jvm开始会把-128到127都的Integer都初始化一遍。

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

当你使用

Integer i1=127;
Integer i2=127;

这种方式的时候,相当于i1,i2都指向了我们默认生成的Integer(127)这个对象上面。

Integer i3=128;
Integer i4=128;

因为超出了127范围,这两个对象相当于重新创建的两个对象。

Integer i5=new Integer(127);
Integer i6=new Integer(127);

相当于重新生成了两个新的对象。

Integer i1=127;
Integer i2=127;

System.out.println("i1是否和i2同地址 "+(i1==i2));

Integer i3=128;
Integer i4=128;

System.out.println("i3是否和i4同地址 "+(i3==i4));

Integer i5=new Integer(127);
Integer i6=new Integer(127);

System.out.println("i5是否和i6同地址 "+(i5==i6));

i1是否和i2同地址 true
i3是否和i4同地址 false
i5是否和i6同地址 false

 

Integer 中有一个  byte[] 数组 用来缓存了 byte取值区间内的数字   自动装箱的时候 若数字是byte内的 则直接使用缓存中的

顶部