Evg*_*eev 0 java collections javadoc comparator
java.util.Set API声明:
集合不包含元素对e1和e2,使得e1.equals(e2)
但据我所知,TreeSet用于Comparable/Comparator确定e1和e2是否重复.我错过了什么吗?
如果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)