(1)HashSet的去重机制:hashCode( )+equals( ),底层先通过存入对象进行运算得到一个hash值,通过hash值得到对应的索引,如果发现table索引所在位置没有数据,就直接存放;如果有数据,就进行equals遍历比较,比较后,不相同就加入,否则就不加入。
(2)TreeSet的去重机制:如果传入了一个Comparator匿名内部类,就用实现的compare去重,如果方法返回0,就认为是相同的元素/数据,就不添加;如果没有传入一个Comparator匿名内部类,则以添加对象实现的Compareable接口的compareTo去重。
TreeSet treeSet = new TreeSet();
(1) 构造器把传入的比较器对象,赋给了TreeSet 的底层的TreeMap 的属性this.comparator
public TreeMap(Comparator super K> comparator) {
this.comparator = comparator;
}
(2)在调用treeSet.add(“tom”), 在底层会执行到
if (cpr != null) {//cpr 就是我们的匿名内部类(对象)
do {
parent = t;
//动态绑定到我们的匿名内部类(对象)compare
cmp = cpr.compare(key, t.key);
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else //如果相等,即返回0,这个Key 就没有加入
return t.setValue(value);
} while (t != null);
}
2、使用有参构造器,创建TreeSet,传入一个Comparator匿名内部类
TreeSet treeSet = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//下面调用String 的compareTo 方法进行字符串大小比较
//如果老韩要求加入的元素,按照长度大小排序
//return ((String) o2).compareTo((String) o1);
return ((String) o1).length() - ((String) o2).length();
}
});



