java - equals(Object o) 和 equals(Name o) 之间有什么有意义的区别吗?如果是,它有什么含义?

标签 java parameters equals comparable

<分区>

我看到这段代码有两个不同的版本,一个来自 Java Oralce,另一个来自 Youtube。两个版本之间的唯一区别是 equals() 方法的参数类型。其中一个是 equals(Object o) 而另一个是 equals(Name o)。我只是想知道这两个版本之间是否有任何有意义的区别?如果是,有什么影响?感谢我能得到的任何帮助!

public class Name implements Comparable<Name> {
    private final String firstName, lastName;

    public Name(String firstName, String lastName) {
        if (firstName == null || lastName == null)
            throw new NullPointerException();
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String firstName() { return firstName; }
    public String lastName()  { return lastName;  }

    public boolean equals(Object o) {
        if (!(o instanceof Name))
            return false;
        Name n = (Name) o;
        return n.firstName.equals(firstName) && n.lastName.equals(lastName);
    }

    public int hashCode() {
        return 31*firstName.hashCode() + lastName.hashCode();
    }

    public String toString() {
    return firstName + " " + lastName;
    }

    public int compareTo(Name n) {
        int lastCmp = lastName.compareTo(n.lastName);
        return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
    }
}

最佳答案

equals(Object o)覆盖 Objectequals方法 equals(Name o)才不是。因此,如果 Name类与某些使用 Object 的类一起使用的 equals (例如 HashSet<Name>ArrayList<Name> 等...)您应该实现 equals(Object o)如果您想覆盖如何确定两个对象是否彼此相等的默认逻辑(默认行为是 a.equals(b) if a==b)。

例如,以下代码将产生输出 2如果equals(Name o)已实现(因为根据 equals(Object o) 的默认实现,添加到 Set 的两个对象彼此不相等)和 1如果equals(Object o)在您的代码示例中实现(因为根据您对 equals(Object o) 的实现,添加到 Set 的两个对象彼此相等,并且 HashSet 防止重复)。

Set<Name> names = new HashSet<>();
names.add(new Name("John","Smith"));
names.add(new Name("John","Smith"));
System.out.println(names.size());

关于java - equals(Object o) 和 equals(Name o) 之间有什么有意义的区别吗?如果是,它有什么含义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36101816/

相关文章:

java - 在Java中添加canvas后无法关闭窗口

java - 为什么 JNLP (Java Web Start) 不下载 jar 文件?

json - 如何将 json 存储到/从 aws 参数存储

java - 如何在 Java 中将任何数组作为参数传递?

java - 为什么更改用作 HashMap 中键的对象的哈希码会使查找返回 null?

java - 字符串等于求值

java - 为什么这个 Clojure 程序这么慢?如何让它跑得快?

Java exec() mysqldump 错误 : Couldn't find table ">"

email - Stripe,是否可以通过电子邮件搜索客户?

javascript - JavascriptMVC 的 assertEqual 函数是什么?