equals(Object o) 和 equals(Name o) 之间有什么有意义的区别吗?如果是,它有什么含义?
is there any meaningful difference between equals(Object o) and equals(Name o)?if yes, what implication does it have?
我看到这段代码有两个不同的版本,一个来自 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)
覆盖了 Object
的 equals
方法,而 equals(Name o)
则没有。因此,如果 Name
class 与某些使用 Object
的 equals
的 class 一起使用(例如 HashSet<Name>
、ArrayList<Name>
, 等等...) 如果你想覆盖默认逻辑如何确定两个对象是否彼此相等,你应该实现 equals(Object o)
(默认行为是 a.equals(b)
if a==b
).
例如,如果实现 equals(Name o)
,下面的代码将产生输出 2
(因为根据 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 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)
覆盖了 Object
的 equals
方法,而 equals(Name o)
则没有。因此,如果 Name
class 与某些使用 Object
的 equals
的 class 一起使用(例如 HashSet<Name>
、ArrayList<Name>
, 等等...) 如果你想覆盖默认逻辑如何确定两个对象是否彼此相等,你应该实现 equals(Object o)
(默认行为是 a.equals(b)
if a==b
).
例如,如果实现 equals(Name o)
,下面的代码将产生输出 2
(因为根据 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());