java.util.Set API中可能存在的错误

Evg*_*eev 0 java collections javadoc comparator

java.util.Set API声明:

集合不包含元素对e1和e2,使得e1.equals(e2)

但据我所知,TreeSet用于Comparable/Comparator确定e1和e2是否重复.我错过了什么吗?

fgb*_*fgb 5

如果compareTo与equals(它应该)一致,则TreeSet是使用compareTo还是equals确定相等并不重要.来自JavaDoc:

请注意,如果要正确实现Set接口,则由set维护的排序(无论是否提供显式比较器)必须与equals一致.(有关与equals一致的精确定义,请参阅Comparable或Comparator.)这是因为Set接口是根据equals操作定义的,但TreeSet实例使用compareTo(或compare)方法执行所有元素比较,因此从集合的角度来看,通过这种方法被认为相等的元素是相等的.集合的行为即使其排序与equals不一致也是明确定义的; 它只是不遵守Set接口的一般合同.

此程序将打印'true',即使equals始终返回false.但是这个bug实际上是compareTo和equalsA不一致的,并且不是TreeSet中的错误.

class A implements Comparable<A> {
    public int compareTo(A a) {
        return 0;
    }

    public boolean equals(Object other) {
        return false;
    }

    public static void main(String[] args) {
        TreeSet<A> set = new TreeSet<A>();
        set.add(new A());
        System.out.println(set.contains(new A()));
    }
}
Run Code Online (Sandbox Code Playgroud)