java正在重写hashCode,在向树集合添加非基本对象时,java是必要的吗?
为了更好地理解自然排序,我将遵循一个教程,使用TreeSet和类似的界面
教程告诉我,要向集合中添加非基本自定义对象,我需要实现equals()
和hashCode()
。然而,即使没有实现这些方法,我也能够编译和运行代码(如下所示)。我将IntelliJ与Java 8结合使用
在使用TreeSet(SortedSet接口)和自然排序时,重写equals()
和hashCode()
是否绝对必要
class My_Person implements Comparable<My_Person>{
private String name;
public My_Person(String name) {
this.name = name;
}
public String toString() {
return name;
}
// @Override
// public boolean equals(Object o) {
// if (this == o)
// return true;
// if (o == null || getClass() != o.getClass())
// return false;
// My_Person my_person = (My_Person) o;
// return Objects.equals(name, my_person.name);
// }
//
// @Override
// public int hashCode() {
// return Objects.hash(name);
// }
@Override
public int compareTo(My_Person person) {
return name.compareTo(person.name);
}
}
public class NaturalOrdering {
public static void main(String[] args) {
List<My_Person> list = new ArrayList<>();
Set<My_Person> set = new TreeSet<>();
addElement(list);
addElement(set);
Collections.sort(list);
showElement(list);
System.out.println("\n");
showElement(set);
}
private static void addElement(Collection<My_Person> collection) {
collection.add(new My_Person("Joe"));
collection.add(new My_Person("Sue"));
collection.add(new My_Person("Juliet"));
collection.add(new My_Person("Clare"));
collection.add(new My_Person("Mike"));
}
private static void showElement(Collection<My_Person> collection) {
for(My_Person element: collection) {
System.out.println(element);
}
}
}
# 1 楼答案
这取决于你对平等的要求。如果不重写
equals
和hashCode
,则两个对象定义为相等当且仅当它们相同(即同一个对象)时。如果你需要其他的等式定义,你必须重写这些方法# 2 楼答案
TreeSet或任何套装都不需要它。但布景本质上是独特物品的集合。对于基本类型,Java有办法知道两个对象是否相同。对于非原语用户,必须告诉Java如何知道两个对象是否相同,方法是重写
equals
和hashcode
方法,这些方法由Set#add方法调用,以确定要添加的对象是否已经存在于集合中。因此,如果在集合中需要一个功能上唯一的对象,那么应该实现equals
和hashcode
方法。希望这有帮助^关于同一个话题