【问题标题】:Integer wrapper class and == operator - where is behavior specified? [duplicate]整数包装类和 == 运算符 - 在哪里指定行为? [复制]
【发布时间】:2011-07-31 17:09:24
【问题描述】:
Integer integer1 = 127;
Integer integer2 = 127;
System.out.println(integer1 == integer2);//true

integer1 = 128;
integer2 = 128;
System.out.println(integer1 == integer2);//false

我发现它在-128 - 127的范围内返回==(如果是的话),为什么会有这样的规范?

【问题讨论】:

    标签: java comparison boxing unboxing


    【解决方案1】:

    因为Integer.valueOf(int)中的这段代码:

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

    说明:

    Integer integer1 = 127Integer integer1 = Integer.valueOf(127) 的快捷方式,对于介于 -128 和 127(含)之间的值,整数会被放入缓存中并多次返回,而更高和更低的数字每次都会生成新的整数。

    【讨论】:

    • 除此之外,JDK 规范说 -128 和 128 之间的整数被缓存。根据您的 JDK,可能还会缓存其他值。
    • 好的。这有什么意义,不就是个彩蛋,会不会招来什么坏事>?
    • @Jigar 不,这是记录在案的行为。只有将对象与 == 进行比较时才会出现问题。对基元使用 ==,对对象使用 equals()。整数是对象,而不是基元。
    【解决方案2】:

    == 将返回 true 如果它是完全相同的对象。在该范围内对 Java“实习生”数字中的整数进行装箱,因此此类数字的任何装箱版本都将产生完全相同的对象。

    要在比较中避免这种影响,请使用 .equals()

    System.out.println(integer1.equals(integer2));
    

    【讨论】:

    • 好的。这有什么意义,不就是个彩蛋,会不会招来什么坏事>?
    • 如果您使用 .equals() 比较变量的内容并使用 == 比较实际的对象引用,就不会发生任何坏事,相信我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2021-12-30
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多