TreeSet 使用 compareTo,试试这个:
public class A {
private int i;
A(int i) {
this.i = i;
}
@Override
public boolean equals(Object t) {
if (this == t)
return true;
if (!( t instanceof A))
return false;
return (this.i == ((A)t).i);
}
public static void main(String[] args) {
List<A> remove = Arrays.asList(new A(123), new A(789));
Set<A> set = new TreeSet<A>(new Comparator<A>() {
@Override
public int compare(A o1, A o2) {
return o1.i - o2.i;
// return 0; // everything get removed
}
});
set.add(new A(123));
set.add(new A(456));
set.add(new A(789));
set.add(new A(999));
set.removeAll(remove);
for (A a : set) {
System.out.println(a.i);
}
System.out.println("done");
}
}
使 Comparator 始终返回 0,所有内容都将被删除!如果不使用 Comparator 而是实现 Comparable,也会发生同样的情况。
TreeSet 基于在 getEntry 中使用 compareTo 的 TreeMap。
在 TreeSet 的 Javadoc 中,您可以(最终)阅读:
... Set 接口是根据 equals 操作定义的,但TreeSet 实例使用其 compareTo(或 compare)方法执行所有元素比较...
[]]