等元素和树集

时间:2017-05-08 10:18:25

标签: java treeset

创建一个实现Comparable的静态嵌套类,并覆盖Object.equals,使e1.compareTo(e2)==0e1.equals(e2)==true不是同义词。

然后我使用add方法将对象分别添加到TreeSetHashSet

我期望将多个这样的对象插入到TreeSet或HashSet中会成功,因为两者都声称依赖于equals来确定唯一性,但是我发现将多个这样的对象插入到TreeSet中会在插入它们时失败HashSet将成功。

public class Test {

    /*
     * This inner class deliberately has a compareTo method that is not
     * consistent with equals
     */
    static class TestObject implements Comparable<TestObject> {
        @Override
        public int compareTo(TestObject arg0) {
            // No two of these objects can be ordered
            return 0;
        }

        @Override
        public boolean equals(Object arg0) {
            // No two of these objects are ever equal to each other
            return false;
        }
    }

    public static void printSuccess(boolean success) {
        if (success)
            System.out.println(" Success");
        else
            System.out.println(" Failure");
    }

    public static void main(String[] args) {
        TreeSet<TestObject> testTreeSet = new TreeSet<TestObject>();
        HashSet<TestObject> testHashSet = new HashSet<TestObject>();

        System.out.println("Adding to the HashSet:");
        printSuccess(testHashSet.add(new TestObject()));
        printSuccess(testHashSet.add(new TestObject()));
        printSuccess(testHashSet.add(new TestObject()));

        System.out.println("Copying to the TreeSet:");
        for (TestObject to : testHashSet) {
            printSuccess(testTreeSet.add(to));
        }
    }
}

以上程序的输出

Adding to the HashSet:
 Success
 Success
 Success
Copying to the TreeSet:
 Success
 Failure
 Failure

有人可以告诉我为什么Tree set表现得像这样吗?

2 个答案:

答案 0 :(得分:5)

compareTo的返回值0表示对象相等,因此e1.compareTo(e2) == 0当且仅当e1.equals(e2) == true

TreeSet保证使用compare方法,因此它使用compare方法,而HashSet则不使用equals方法。请尝试将compareTo方法更改为正/负数。

您可以阅读有关Compareable界面here的更多信息。

答案 1 :(得分:0)

此外,javadoc of java.util.Comparator明确说明了此案例,并告知Comparator的{​​{1}}必须与SortedSet保持一致:

  

例如,假设一个人添加了两个元素a和b   (a.equals(b)&amp;&amp; c.compare(a,b)!= 0)到一个空的TreeSet   比较器c。第二个添加操作将返回true(和大小   由于a和b不相等,因此树集会增加)   树集的视角,即使这是相反的   Set.add方法的规范。