前言
了解TreeSet的底层数据结构、以及排序的特性等等,便于更好的编程。
一、数据结构
底层)TreeMap,TreeMap 源码简单分析
private transient NavigableMap<E,Object> m;
二、排序
TreeSet 与 HashSet 的区别就是TreeSet 可以对容器内的元素排序。
1)通过元素自身实现比较规则(内部排序),此时该元素的类是继承了Comparable接口,实现了CompareTo()方法。
如Integer、String
public final class Integer extends Number implements Comparable<Integer>
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
public TreeSet() {
this(new TreeMap<>());
}
2)通过比较器指定比较规则(外部排序),去实现一个Comparator类,重写里面的比较方法CompareTo(),new出这个对象作为外部比较器。
Set<Person> sp = new TreeSet<Person>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.name.compareTo(o2.name);
}
});
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
注:要么是泛型类实现了Comparable接口(内部规则),要么是new 一个Comparator对象,然后重写CompareTo方法(外部规则)。必须要有一种,否则能排序的TreeSet就会报错,class com.xhu.java.Person cannot be cast to class java.lang.Comparable
三、添加元素
private static final Object PRESENT = new Object();
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
同样这里使用元素作为Key,Value使用同一个final Object对象。
总结
1)TreeSet 底层是一个TreeMap
2)TreeSet 可以通过内部外部排序规则来对key即元素排序
参考文献
[1] [JDK 1.12]