为什么object.equals(new Integer(1))等于true?

jaz*_*nie 4 java

我正在努力理解这个Koan:

@Koan
public void equalsMethodCanBeChangedBySubclassesToTestsIfTwoObjectsAreEqual() {
    Object object = new Integer(1);
    assertEquals(object.equals(object), true);
    assertEquals(object.equals(new Integer(1)), __);
    // Note: This means that for the class 'Object' there is no difference between 'equal' and 'same'
    // but for the class 'Integer' there is difference - see below
}
Run Code Online (Sandbox Code Playgroud)

据我所知,因为objectObject类的一个实例,该.equals()方法尚未被覆盖,因此检查对象是否相等.

如果new Integer(1)创建一个新实例,那么它应该是一个单独的对象object.按照我的思路,正确的答案应该是false,但只有true通过.我逻辑中的缺陷在哪里?

编辑:我知道-128和127之间的整数是缓存的.如果我对该object对象的理解是正确的(如上所述),那么这是无关紧要的.

Tim*_*mos 9

整数覆盖equals并检查底层int是否等于int另一个Integer实例,如果是,则返回true.equals调用Integer的方法而不是Object 的方法的原因是运行时类型object是Integer.

Integer是一个Object,但由于被覆盖equals,因此不使用对象标识.

以下所有布尔表达式的计算结果为true:

    print((new Integer(1).equals(1)));
    print((new Integer(1).equals(new Integer(1))));
    print((((Integer) 1).equals(new Integer(1))));
    print(((Integer) 1).equals(1));
Run Code Online (Sandbox Code Playgroud)

现在考虑自动装箱,它重用[-128,127]范围内的值的实例.以下关于对象相等性的陈述都在评估true:

    1 == ((Integer) 1)
    ((Integer) (-128)) == ((Integer) (-128)) // in autoboxing range
    ((Integer) (+127)) == ((Integer) (+127)) // same

    ((Integer) (-200)) != ((Integer) (-200)) // not autoboxing
    ((Integer) (+200)) != ((Integer) (+200)) // same

    ((Integer) (-128)) != (new Integer(-128)) // explicit new instance, so no autoboxing
    ((Integer) (+127)) != (new Integer(+127)) // same
Run Code Online (Sandbox Code Playgroud)