jdk TreeSet工作原理分析

TreeSet跟HashSet,LinkedHashSet一样,都是Set接口的实现类。

HashSet内部使用的HashMap,LinkedHashSet继承HashSet,内部使用的是LinkedHashMap。

TreeSet实现的是NavigableSet接口,而不是HashSet和LinkedHashSet实现的Set接口。

NavigableSet接口继承自SortedSet接口,SortedSet接口继承自Set接口。

NavigableSet接口比Set更方便,可以使用firstKey[最小关键字],lastKey[最大关键字],pollFirstEntry[最小键值对],pollLastEntry[最大键值对],higherEntry[比参数关键字要大的键值对],lowerEntry[比参数关键字要小的键值对]等等方便方法,可以使用这些方法方便地获取期望位置上的键值对。

TreeSet原理分析

TreeSet跟HashSet一样,内部都使用Map,HashSet内部使用的是HashMap,但是TreeSet使用的是NavigableMap。

TreeSet的几个构造方法会构造NavigableMap,如果使用没有参数的构造函数,NavigableMap是TreeMap:

TreeSet(NavigableMap<E,Object> m) {
    this.m = m;
}

public TreeSet() {
    this(new TreeMap<E,Object>());
}

public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}

add方法调用Map的put方法:

public boolean add(E e) {
    return m.put(e, PRESENT)==null;
}

remove方法调用Map的remove方法:

public boolean remove(Object o) {
    return m.remove(o)==PRESENT;
}

原理基本跟HashSet一样。

// 最小的关键字
public E first() {
    return m.firstKey();
}

// 最大的关键字
public E last() {
    return m.lastKey();
}

// 比参数小的关键字
public E lower(E e) {
    return m.lowerKey(e);
}

一个TreeSet例子

使用没有参数的TreeMap构造函数,内部的Map使用TreeMap红黑树:

TreeSet<String> set = new TreeSet<String>();
set.add("1:语文");
set.add("2:数学");
set.add("3:英语");
set.add("4:政治");
set.add("5:物理");
set.add("6:化学");
set.add("7:生物");
set.add("8:体育");

内部红黑树结构如下:

还可以调用TreeSet的其他方法:

set.first(); // 1:语文
set.last(); // 8:体育
set.higher("5:物理"); // 6:化学
set.lower("5:物理"); // 4:政治
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
本文作者:Format
原文链接: http://fangjian0423.github.io/2016/04/08/jdk_treeset/
版权归作者所有,转载请注明出处