有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);
        }
    }
}

共 (2) 个答案

  1. # 1 楼答案

    这取决于你对平等的要求。如果不重写equalshashCode,则两个对象定义为相等当且仅当它们相同(即同一个对象)时。如果你需要其他的等式定义,你必须重写这些方法

  2. # 2 楼答案

    TreeSet或任何套装都不需要它。但布景本质上是独特物品的集合。对于基本类型,Java有办法知道两个对象是否相同。对于非原语用户,必须告诉Java如何知道两个对象是否相同,方法是重写equalshashcode方法,这些方法由Set#add方法调用,以确定要添加的对象是否已经存在于集合中。因此,如果在集合中需要一个功能上唯一的对象,那么应该实现equalshashcode方法。希望这有帮助^关于同一个话题