不明白这种equals方法的实现

时间:2016-04-06 12:41:06

标签: java oop methods equals

几天前,我的教授向我们展示了如何实现equals方法等等。

这是他的equals方法的代码示例,我不理解其中一部分:

public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Knjiga other = (Knjiga) obj;
    return Objects.equals(isbn,other.isbn);
}

在第一个if语句中,他检查这个(当前对象)是否与对象obj具有相同的引用(&= 39运算符是什么?只比较两个引用)

如果他们得到相同的参考,它将返回真实? 但我们永远不会检查其他字段,例如isbn以及我们可以提供的更多字段,因为如果这两个对象具有相同的引用,方法将永远不会出现。

在我看来,这个方法类似于double equals operator cuz这两个中的任何一个都不会检查字段,只是引用?

5 个答案:

答案 0 :(得分:8)

如果被比较的两个对象具有相同的引用,则这是相同的对象,并且在比较其他任何内容时都没有意义。您可以立即返回accessibilityIdentifier并保存一些比较。

在这种情况下,其他属性保证相同。

答案 1 :(得分:1)

如果delayedexpansion为真,那么它就是同一个对象,所以它显然是相等的。

如果这两个if条款不是真的

(this == obj)

这意味着这两个对象既来自同一个类,又不是同一个对象,所以使用

if (obj == null)
    return false;
if (getClass() != obj.getClass())
    return false;
检查

是否两个对象的Knjiga other = (Knjiga) obj; return Objects.equals(isbn,other.isbn); 相等,如果是,则两个isbn对象也是相同的。

答案 2 :(得分:1)

请考虑以下代码:

    String s1 = new String("Test");
    String s2 = new String("Test");
    String s3 = s2;
    String s4 = "Test";
    String s5 = "Test";
    System.out.println(s1 == s2); //Prints false
    System.out.println(s2 == s3); //Prints true
    System.out.println(s3 == s4); //Prints false
    System.out.println(s4 == s5); //Prints true

s1s2是String对象的新实例。仅仅因为它们具有相同的表观值“测试”,它们不一定具有与您的程序相同的值。因此,这两者在对象方面并不相同。

s3s2的精确副本,这意味着它与s2的String实例完全相同。这反过来意味着它们的实例在客观上是相同的。

s4是直接分配给“Test”的String,不一定是String对象的新实例。因此,客观上,他们并不平等。 (见String Interning

s5也直接分配给“测试”,因此它等同于s4。再次,请参阅string interning以了解其工作原理的详细信息。

这是描述你的情况的一种不太复杂的方式,但是应该对对象比较的基础进行很好的解释。

答案 3 :(得分:1)

代码equals方法的逻辑:

  1. First condition:很明显。如果两个对象的引用相同,则返回true

    if (this == obj)
        return true;
    
  2. Second condition:如果其他对象为NULL,则返回false

    if (obj == null)
       return false;
    
  3. Third condition:现在,当前对象和其他对象都不为空。检查两个对象的className是否相同。如果类不同,则返回false。

     if (getClass() != obj.getClass())
        return false;
    
  4. Fourth condition:现在两个对象都不为null并且属于同一个类。检查这些对象中的属性[{isbn]是否相同。如果它们不相同,则返回false。

     Knjiga other = (Knjiga) obj;
     return Objects.equals(isbn,other.isbn);
    

答案 4 :(得分:1)

使用==比较对象引用。通常当你在类中重写equals方法来比较你的类的两个对象时,最好先使用相等的引用。这将比较对象内部的所有属性。 考虑示例Cat类

public class Cat {
 String country;
 int numberOfCats;
 public Cat(String country, int numberOfCats) {
    this.country = country;
    this.numberOfCats = numberOfCats;
 }
 public boolean equals(Object obj) {
    if(this == obj)
        return true;
    if(obj == null)
        return false;
    Cat eqlObj = (Cat) obj;
    if(this.country.equals(eqlObj.country) && this.numberOfCats == eqlObj.numberOfCats)
        return true;    
    return false;
 }
}

测试课

public class TestCat {
 public static void main(String args[]) {
    Cat obj1 = new Cat("France", 9600);
    Cat obj2 = obj1;
    obj1.equals(obj2);
 }
}

在上面的测试类中,obj1和obj2都指向同一个Cat对象。比较引用将返回" true",即首先阻塞等于。

另一项测试

public class TestCat {
 public static void main(String args[]) {
    Cat obj1 = new Cat("France", 9600);
    Cat obj2 = new Cat("France", 9600);
    obj1.equals(obj2);
 }
}

在这个测试类中,为obj1和obj2创建了新对象,因此它们所持有的引用将是不同的。对象中指定的值相同。首先,如果equals中的块将失败,因为参考不同。第三,如果equals中的块将比较值并返回" true"。

希望这会有所帮助..