这个程序结果 我没看懂。。。

我今年大三 发布于 2017/09/12 14:32
阅读 718
收藏 0

为什么一个true 一个false。。

加载中
1
狂暴的蜗牛君
狂暴的蜗牛君

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);  
  }  

 

哈斯卡会
哈斯卡会
正解
我今年大三
我今年大三
回复 @蜗牛君 : 嗯 我debug过了。。是这样的~学习了。
狂暴的蜗牛君
狂暴的蜗牛君
回复 @我今年大三 : 你的代码 Integer i=100; 自动装箱会用 Interger的valueOf 来给出一个实例
我今年大三
我今年大三
- - 我的代码 应该没用到valueOf吧。。
0
雨落秋垣
雨落秋垣

integer 是int的封装类

0
雨落秋垣
雨落秋垣

取值不能超过199 

我今年大三
我今年大三
我取198 也是false啊。。
0
雨落秋垣
雨落秋垣

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

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

超过128就是false了

0
Gavin___
Gavin___

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

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);  
  }  

 

正解

0
GanLuo960214
GanLuo960214

不能过 4位(bytes) int

0
我BIG你
我BIG你

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

0
W
William-T
/**
 * 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

 

0

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

返回顶部
顶部