0

如果省略第 3-5 行(我为这些行编号),此 equals() 方法将产生相同的输出。这些线的意义何在?

/** Return true if that Beetle has the same parts as this one. */   
public boolean equals(Object that) {  
    3. if (this == that) {  
    4.    return true;  
    5. }  
       if (that == null) {  
         return false;  
       }  
      if (getClass() != that.getClass()) {  
         return false;  
      }

      Beetle thatBeetle  = (Beetle) that;  

      return body == thatBeetle.body   
            && eyes == thatBeetle.eyes   
            && feelers == thatBeetle.feelers   
            && head == thatBeetle.head   
            && legs == thatBeetle.legs   
            && tail == thatBeetle.tail;   
}
4

3 回答 3

3

检查 == 引用相等性很快,如果为 true,则将对象与自身进行比较 - 根据定义相等。

这通常是比较对象时的第一步,因为它比比较所有细节要快得多。但它更常用于调用者/客户端函数,而不是在 equals() 实现中。

例如,在线性搜索中:

public int indexOfBeetle (Beetle beetle, List<Beetle> list) {
    for (int i = 0; i < list.size(); i++) {
        Beetle cand = list.get( i);
        if (cand == beetle || cand.equals( beetle))
            return i;    // Found.
    }
    // Not Found.
    return -1;
}
于 2013-09-21T01:52:04.260 回答
2

运算符==检查对象是否是内存中的同一实例,而当您覆盖时,equals您通常希望执行逻辑测试。

举个例子:

public class Person {
   private String name;

   // Here there are constructor and getters and setters
}

现在让我们运行这些行:

Person a = new Person();
Person b = a;
Person c = new Person();

如果您将这些实例与==此进行比较,您将得到:

a == a ==> true
a == b ==> true
a == c ==> false

现在,让我们设置名称:

a.setName("Joe"); // This also sets b because they're the same object
c.setName("Joe");

如果我们equals看起来像这样:

public boolean equals (Object other) {
    if(other == this) return true;

    if(other instanceof Person == false) return false;


    if(this.getName().equals(((Person) other).getName())) return true;

}

所以我们现在会得到即使a.equals(c)是假的。truea==c

那么,为什么我们有第一行?- 某些对象的相等计算成本更高,通过在开始时检查此条件,您可能会节省一些不必要的计算

于 2013-09-21T01:47:58.887 回答
1

这样做是在检查两个对象是否指向相同的内存地址。使用 .equals 而不使用它,您将获得相同的结果,因为如果它们指向相同的内存地址,那么显然它们是相等的。但是这样做会更快,这就是为什么大多数开发人员将这条线放在 .equals

于 2013-09-21T01:51:54.060 回答