为什么我的重复条目没有用 HashSet 过滤掉,但是用 TreeSet 过滤掉了?

0 java collections hashset treeset

我在这里尝试了一点。但是我不明白为什么 TreeSet 可以在这里过滤掉重复的条目,而 HashSet 不能。


public class DataClass implements Comparable<DataClass> {
    private final String data;

    public DataClass(String data) {
        this.data = data;
    }

    @Override
    public boolean equals(Object other) {
        if (other == null || other.getClass() != this.getClass()) return false;
        DataClass dc = (DataClass) other;
        return this.data.length() == dc.data.length();
    }

    @Override
    public int compareTo(DataClass dc) {
        return Integer.compare(this.data.length(), dc.data.length());
    }

    @Override
    public String toString() {
        return data;
    }
}

Run Code Online (Sandbox Code Playgroud)

这是我的主要方法:

DataClass[] data = new DataClass[4];
        data[0] = new DataClass("Hans");
        data[1] = new DataClass("Tom");
        data[2] = new DataClass("Fred");
        data[3] = new DataClass("Sia");

    
        System.out.println();
        TreeSet<DataClass> treeSet = new TreeSet<>();
        for (DataClass dc : data) treeSet.add(dc);
        for (DataClass dc : treeSet)
            System.out.print(dc+" ");

        System.out.println();
        HashSet<DataClass> hashSet = new HashSet<>();
        for (DataClass dc : data)
            hashSet.add(dc);
        for (DataClass dc : hashSet)
            System.out.print(dc+" ");
Run Code Online (Sandbox Code Playgroud)

输出是:

Tom Hans 
Hans Tom Fred Sia 
Run Code Online (Sandbox Code Playgroud)

HashSet 不关注 equals() 方法吗?我现在也没有在文档中找到任何内容。我错过了什么?

nul*_*awe 7

您需要覆盖该hashCode()方法以HashSet使 不包含重复项,因为HashSet只有在发生冲突时才会检查相等性。但是,TreeSet不需要hashCode()被覆盖。请参阅:HashSet 包含重复条目