-2
public class ObjectEqualsComparison {
      public static void main(String[] args) {      
           Object ob1 = new Object();  // address location 0×1234 
           Object ob2 = new Object();  // address location 0×2345 

           System.out.println(ob1 == ob2); // prints false correct
           System.out.println(ob1.equals(ob2)); //prints false which is incorrect//it should be true.

           //ob1 == ob2 gives false which is correct since you are comparing address/references .
           //ob1.equals(ob2) is also giving false.can you tell me why since we are comparing contents       
        }
}

编辑::我的问题是我是否需要覆盖 equals() 方法。如果这样,equals() 覆盖的方法应该是什么样子。请帮忙

4

2 回答 2

1

的输出System.out.println(ob1.equals(ob2));是正确的,因为您正在比较 type 的实例object。如果您正在比较覆盖类型的实例,equals那将是另一回事!

例如,如果您有:

class SomeType{

    private Object comparisonField;

    public SomeType(Object comparisonValue){
        this.comparisonField = comparisonValue;
    }

    @overrides
    public int getHashCode(Object other){
        if(this.comparisonField == null)
            return super.getHashCode();

        return this.comparisonField.getHashCode();
    }

    @overrides
    public boolean equals(Object other){
        if(comparisonField == null || other == null)
           return super.equals(other);

        return comparisonField.equals(((SomeType)other).comparisonField);
    }
}

比较时:

SomeType inst1 = new SomeType("SAME VALUE");
SomeType inst2 = new SomeType("SAME VALUE");

bool areEqual = inst1.equals(inst2);  // calls the overriden equals method on SomeType
                                      //   which would return TRUE 

// but if you use object:

Object obj1 = new Object();
Object obj2 = new Object();

bool areEqual = obj1.equals(obj2);    // will call equals on Object;
                                      //   and always return false;
于 2013-03-12T15:59:30.973 回答
1

只有当两个对象是相同的实例,即内存中的相同对象时,Object 中的 equals() 的默认实现才会返回 true。每当您像以前那样创建 2 个单独的 Object 实例时,它们不会引用内存中的同一个对象,这就是它返回 false 的原因。

正如 Miky 所指出的,您可以通过在类中覆盖 equals() 来修改默认行为以提供自定义等效语义。

然而,Miky 的错误在于将你的类(例如,他的示例中的 SomeType 实例)转换为 Object 会改变 equals() 的结果。

boolean areEqual = obj1.equals(obj2);

仍然会调用 SomeType 定义的被覆盖的 equals() 方法,而不管它被一般地引用为其超类型 Object 的事实。这就是多态的力量。

因此,要回答您最初的问题,您必须创建自己的类并在该类中覆盖 equals(),并使用执行对您的类有意义的任何等效检查的实现。例如,如果您有一个 Customer 类并且客户由他们的电子邮件地址唯一定义,那么在 Customer.equals() 中,您将比较电子邮件地址,如果它们相同则返回 true。

请记住,equals() 的签名接受 Object 参数。正确构造的 equals 实现将检查参数是否为 null 以及它是否是相同类型的实例。另请注意,当您覆盖 equals() 时,您必须覆盖 hashCode()。

有大量关于覆盖 equals() 和 hashCode() 的信息很容易找到,我建议您进行更多研究。一个好的起点总是“Effective Java”一书。

于 2013-03-12T17:05:02.577 回答