整数';s特定(Java核心)

整数';s特定(Java核心),java,Java,我在采访中有一个问题: public Integer v1 = 127; public Integer v2 = 127; public Integer v3 = 513; public Integer v4 = 513; public void operatorEquals(){ if (v1==v2) System.out.println("v1 == v2"); else throw new RuntimeException("v1 != v2");

我在采访中有一个问题:

public Integer v1 = 127;
public Integer v2 = 127;
public Integer v3 = 513;
public Integer v4 = 513;

public void operatorEquals(){
    if (v1==v2)
        System.out.println("v1 == v2");
    else throw new RuntimeException("v1 != v2");
    if (v3==v4)
        System.out.println("v3 == v4");
    else throw new RuntimeException("v3 != v4");
}

**Result**: java.lang.RuntimeException: **v3 != v4**

你能解释一下:为什么?我没有任何建议。

Java
Integer
对象缓存到127,但不超过127

其效果与工作原理非常相似,因此所有值在[-128;127]范围内的
Integer
对象也都是相同的实例——也通过引用相等检查返回true(例如
=
),而不仅仅是使用
.equals()

从Arnaud Denoyelle编辑

Integer.java

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);
}
公共静态整数值(int i){
断言IntegerCache.high>=127;

如果(i>=IntegerCache.low&&i这是Java在自动装箱时定义的行为。请检查相关的。也请阅读此处的讨论部分。以下段落摘自规范:

如果要装箱的值p为true、false、介于\u0000到\u007f范围内的字节或字符,或介于-128和127(包括-128和127)之间的整数或短数字,则让r1和r2为p的任意两个装箱转换的结果。r1==r2的情况始终如此

理想情况下,装箱一个给定的原语值p,总是会产生一个 相同的参考。在实践中,使用 现有的实现技术。上述规则是实用的 妥协。上述最后一条要求某些共同价值观 始终被装箱到无法区分的对象中。实现可能会 惰性地或急切地缓存这些值 不允许对上已装箱值的标识进行任何假设 程序员的部分。这将允许(但不要求)共享 部分或全部参考资料

这确保在大多数常见情况下,行为将是 想要的,不施加不适当的绩效处罚,尤其是 在小型设备上。例如,内存有限的实现可能会更少 例如,缓存所有char和short值,以及int和long值 介于-32K到+32K范围内的值

对于整数,那些介于-128和127(包括-128和127)之间的自动装箱整数对象将在check==中返回true。据说这些整数被缓存在一个常量池中。
但是如果你只做
newinteger(int)
创建的对象总是不同的。

我不会感叹那么多。你能更详细地解释一下吗…?我编辑以显示
Integer#valueOf()
的代码。如你所见,IntegerCache.low(-128)和IntegerCache.high(+127)之间的代码,您实际上并没有创建新的整数。@user2171669也许您还可以看看这里解释的字符串interning@ArnaudDenoyelle谢谢,不过我必须说,自己编辑问题时被编辑感觉有点奇怪