为什么使用 == 比较两个整数有时有效,有时无效?

3
我知道在使用“==”时比较引用不是一个好主意,但我不明白为什么会发生这种情况。
Integer a=100;
Integer b=100;
Integer c=500;
Integer d=500;
System.out.println(a == b); //true
System.out.println(a.equals(b)); //true
System.out.println(c == d); //false
System.out.println(c.equals(d)); //true

是的,这是重复的!!我从这里得到了完美的答案https://dev59.com/g2kw5IYBdhLWcg3wSoks。谢谢大家。 - Hiren
3个回答

15

Java语言规范指出,对于-128到127之间的包装对象会被缓存并被Integer.valueOf()重复使用,而此方法会在自动装箱中隐式地被使用。


1

介于-128和127之间的整数被缓存(相同值的整数引用相同的Object)。比较您的ab引用返回true,因为它们是相同的Object。您的cd不在该范围内,因此它们的引用比较返回false


0

整数值在-128到127之间被缓存。

请参见下面的源代码:

private static class IntegerCache {
    private IntegerCache(){}

    static final Integer cache[] = new Integer[-(-128) + 127 + 1];

    static {
        for(int i = 0; i < cache.length; i++)
            cache[i] = new Integer(i - 128);
    }
}

public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
    return new Integer(i);
}

a == b 返回 true 表示 a 和 b 引用同一个对象。c == d 返回 false 表示 c 和 d 不是同一个对象(即使它们的 intValue 相同)。 - Max
是的,Mastov说得完全正确...起初我也感到困惑...请删除与此帖子无关的评论。谢谢大家。 - Anil Reddy Yarragonda
1
仅为关闭此线程(我强调了一下),从重复问题中选择的响应中得出一个非常重要的结论:道德:当您对基础int值感兴趣时,请勿比较Integer引用。使用.equals()或首先获取int值。 - Max
是的,但这对每个人都很清楚,甚至在问题中都有明确说明! - mastov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接