1.TreeSet简介
TreeSet是基于TreeMap的NavigableSet实现的。
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
{
- 实现了NavigableSet,支持排序
- 实现了Colneable接口,可以克隆
- 实现了Serializable,可以进行序列化和反序列化
2.基本属性
/**
* The backing map.
* 底层map,维护一个NavigableMap型变量,NavigableMap是TreeMap的接口
*/
private transient NavigableMap<E,Object> m;
// Dummy value to associate with an Object in the backing Map
//static final 的PRESENT来填充map的value
private static final Object PRESENT = new Object();
//构造新的TreeSet,元素按自然排序
public TreeSet() {
this(new TreeMap<E,Object>());
}
3.基本方法
(1)add(E e)
//底层调用treeMap,进行插入操作
//表示任何插入操作,key对应的value都是静态常量PRESENT
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
(2)subSet(E fromElement, boolean fromInclusive,
E toElement, boolean toInclusive)
//根据key的范围,截取Set,调用的是NavigableSet的方法
public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
E toElement, boolean toInclusive) {
return new TreeSet<>(m.subMap(fromElement, fromInclusive,
toElement, toInclusive));
}
(3)headSet(E toElement, boolean inclusive)和tailSet(E fromElement, boolean inclusive)
//返回视图中的所有元素的值 <= toElement
public NavigableSet<E> headSet(E toElement, boolean inclusive) {
return new TreeSet<>(m.headMap(toElement, inclusive));
}
//返回视图中的所有元素的值 >= toElement
public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
return new TreeSet<>(m.tailMap(fromElement, inclusive));
}
(4)spliterator()
//创建key的分割器
public Spliterator<E> spliterator() {
return TreeMap.keySpliteratorFor(m);
}
总结
TreeSet底层主要还是调用的是TreeMap的方法,是基于TreeMap实现的,简单地讲,就是利用TreeMap的key-value中的key来存储数据,实现有序性和唯一性,而value则是static、final的Object变量填充。