Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么使用==比较两个整数有时有效,有时无效?_Java_Types_Comparison - Fatal编程技术网

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

Java 为什么使用==比较两个整数有时有效,有时无效?,java,types,comparison,Java,Types,Comparison,我知道我在使用==时比较引用,这不是一个好主意,但我不明白为什么会发生这种情况 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

我知道我在使用==时比较引用,这不是一个好主意,但我不明白为什么会发生这种情况

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

正在缓存-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);
}
私有静态类整型缓存{
私有整数缓存(){}
静态最终整数缓存[]=新整数[-128)+127+1];
静止的{
for(int i=0;i如果(i>=-128&&iJava语言规范规定至少-128到127的包装器对象被自动装箱隐式使用的
Integer.valueOf()
缓存和重用。

缓存-128和127之间的整数(相同值的整数引用相同的
对象
)比较
a
b
引用返回
true
,因为它们是相同的
对象
。你的
c
d
不在该范围内,因此它们的引用比较返回
false

a==b返回true意味着a和b引用了相同的对象。c==d返回false意味着c和d不是相同的对象(即使它们的intValue是相同的)是绝对正确的Mastov…一开始我也感到困惑…请删除与此帖子相关的无关评论。感谢大家关闭此线程(我有点努力强调),这是非常重要的:寓意:当你对基础的int值感兴趣时,不要比较整数引用。使用.equals()或首先获取int值。是的,但这对每个人来说都很清楚,甚至在问题中都有说明!是的,它是重复的!!我在这里得到了完美的答案。谢谢大家。