源码
TreeSet 底层是 TreeMap
package collection_;
import java.util.Comparator;
import java.util.TreeSet;
/**
* @Author: Gin
* @Description:
* @Modified By: Gin
* @Date: Created in 11:21 2021/9/24
*/
public class TreeSet_ {
public static void main(String[] args) {
// 1. 当我们使用无参构造器创建 TreeSet 时,仍然是无序的
// 2. 如果希望添加的元素按照字符串大小来排序
// 3. 使用 TreeSet 提供的构造器,可以传入一个比较器
// 执行排序规则
//
// TreeSet treeSet = new TreeSet();
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();
// 此时如果在添加 "Rum" 元素,添加失败
// 因为此时的比较方式是字符串长度比较,所以当再次添加长度为 3、6、7、8 的字符串,均会失败
}
});
treeSet.add("Gin");
treeSet.add("Bourbon");
treeSet.add("Vermouth");
treeSet.add("Sherry");
System.out.println(treeSet);
/*
1. 构造器把传入的比较器对象,赋给了 TreeSet 底层的 TreeMap 的 this.comparator 属性
(1) TreeSet.java:
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
(2) TreeMap.java:
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
2. 执行 add() 方法:
(1) TreeSet.java:
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
(2) TreeMap.java:
// 在 TreeMap 底层,会将传入的 comparator 比较器赋值给 cpr
// 也就是构造器中我们创建的匿名内部类对象:
// TreeSet treeSet = new TreeSet(new Comparator() {...}}
Comparator<? super K> cpr = comparator;
if (cpr != null) {
do {
parent = t;
// cpr.compare():会动态绑定到我们的匿名内部类对象,执行我们在匿名内部类的比较逻辑
cmp = cpr.compare(key, t.key);
// 从小到大排序
if (cmp < 0)
t = t.left;
// 从大到小排序
else if (cmp > 0)
t = t.right;
// 返回 0 表示有元素与要添加的元素相同,则不添加(其实是将相同的元素替换掉原来的元素)
else
return t.setValue(value);
} while (t != null);
}
*/
}
}