Java集合(一) —— Collection源碼分析
Java集合(二) —— ArrayList源碼分析
Java集合(三) —— LinkedList源碼分析
Java集合(四) —— PriorityQueue源碼分析
Java集合(五) —— HashSet源碼分析
Java集合(六) —— LinkedHashSet源碼分析
Java集合(七) —— TreeSet源碼分析
Java集合(八) —— HashMap源碼分析
Java集合(九) —— LinkedHashMap源碼分析
Java集合(十) —— TreeMap源碼分析
1.總結(jié)
1.TreeSet底層使用的是TreeMap保存數(shù)據(jù)的钾麸。
2.TreeMap的數(shù)據(jù)結(jié)構(gòu)為紅黑樹(自平衡的二叉排序樹(也叫二叉查找樹或二叉搜索樹))塌鸯,即紅黑樹中序遍歷是有序的蔬崩,樹的遍歷方式都是相對(duì)根節(jié)點(diǎn)來說的佳魔,不懂的小朋友自行百度吧。
3.TreeSet是無序的,即數(shù)據(jù)插入的順序和遍歷得到的數(shù)據(jù)順序可能是不一樣的(不要將插入順序與紅黑樹的可排序搞混了)。
2.TreeSet繼承關(guān)系圖
3.源碼分析
3.1.成員變量分析
// 使用指定的Map保存數(shù)據(jù)
private transient NavigableMap<E,Object> m;
// Map中保存的value值
private static final Object PRESENT = new Object();
3.2.構(gòu)造方法分析
/**
* 使用NavigableMap保存數(shù)據(jù)
*/
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
/**
* 默認(rèn)構(gòu)造使用TreeMap保存數(shù)據(jù)
*/
public TreeSet() {
this(new TreeMap<E,Object>());
}
/**
* 指定使用的比較器
*/
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
}
public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}
對(duì)于日常開發(fā),基本上知道默認(rèn)的構(gòu)造方法就夠了
3.3.常用方法
1.新增元素
/**
* 默認(rèn)調(diào)用了TreeMap保存數(shù)據(jù)
*/
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
public boolean addAll(Collection<? extends E> c) {
// m即TreeMap的size等于0杂曲,c即集合的size大于0,m必須是TreeMap袁余,c必須是SortedSet
// 基本上很少情況會(huì)同時(shí)滿足上述四個(gè)條件
if (m.size()==0 && c.size() > 0 &&
c instanceof SortedSet &&
m instanceof TreeMap) {
SortedSet<? extends E> set = (SortedSet<? extends E>) c;
TreeMap<E,Object> map = (TreeMap<E, Object>) m;
Comparator<?> cc = set.comparator();
Comparator<? super E> mc = map.comparator();
if (cc==mc || (cc != null && cc.equals(mc))) {
// 新增數(shù)據(jù)的處理方法擎勘,這里就不再展開說明了
map.addAllForTreeSet(set, PRESENT);
return true;
}
}
// 調(diào)用父類的addAll方法,最終都循環(huán)調(diào)用add方法新增數(shù)據(jù)
return super.addAll(c);
}
2.刪除元素
public boolean remove(Object o) {
return m.remove(o)==PRESENT;
}
/**
* 直接清空TreeMap
*/
public void clear() {
m.clear();
}
3.查找元素
/**
* 獲取第一個(gè)元素
*/
public E first() {
return m.firstKey();
}
/**
* 獲取最后一個(gè)元素
*/
public E last() {
return m.lastKey();
}
關(guān)于TreeSet的分析颖榜,基本上都是關(guān)于TreeMap的棚饵,所以TreeSet沒必要過于深究,具體請(qǐng)看TreeMap的分析掩完。