java 17 - 6 TreeSet集合及其add()方法的源码解析

  TreeSet:能够对元素按照某种规则进行排序。
    排序有两种方式
    A:自然排序
    B:比较器排序

  TreeSet集合的特点:排序和唯一

 1 public class TreeSetDemo {
 2 public static void main(String[] args) {
 3 // 创建集合对象
 4 // 自然顺序进行排序
 5 TreeSet<Integer> ts = new TreeSet<Integer>();
 6 
 7 // 创建元素并添加
 8 // 20,18,23,22,17,24,19,18,24
 9 ts.add(20);
10 ts.add(18);
11 ts.add(23);
12 ts.add(22);
13 ts.add(17);
14 ts.add(24);
15 ts.add(19);
16 ts.add(18);
17 ts.add(24);
18 
19 // 遍历
20 for (Integer i : ts) {
21 System.out.println(i);
22 }
23 }
24 }

 


通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。

TressSet集合的add()方法的源码:

 

 1 interface Collection {...}
 2 
 3 interface Set extends Collection {...}
 4 
 5 interface NavigableMap {
 6 
 7 }
 8 
 9 class TreeMap implements NavigableMap {
10 public V put(K key, V value) {
11 Entry<K,V> t = root;
12 if (t == null) {
13 compare(key, key); // type (and possibly null) check
14 
15 root = new Entry<>(key, value, null);
16 size = 1;
17 modCount++;
18 return null;
19 }
20 int cmp;
21 Entry<K,V> parent;
22 // split comparator and comparable paths
23 Comparator<? super K> cpr = comparator;
24 if (cpr != null) {
25 do {
26 parent = t;
27 cmp = cpr.compare(key, t.key);
28 if (cmp < 0)
29 t = t.left;
30 else if (cmp > 0)
31 t = t.right;
32 else
33 return t.setValue(value);
34 } while (t != null);
35 }
36 else {
37 if (key == null)
38 throw new NullPointerException();
39 Comparable<? super K> k = (Comparable<? super K>) key;
40 do {
41 parent = t;
42 cmp = k.compareTo(t.key);
43 if (cmp < 0)
44 t = t.left;
45 else if (cmp > 0)
46 t = t.right;
47 else
48 return t.setValue(value);
49 } while (t != null);
50 }
51 Entry<K,V> e = new Entry<>(key, value, parent);
52 if (cmp < 0)
53 parent.left = e;
54 else
55 parent.right = e;
56 fixAfterInsertion(e);
57 size++;
58 modCount++;
59 return null;
60 }
61 }
62 
63 class TreeSet implements Set {
64 private transient NavigableMap<E,Object> m;
65 
66 public TreeSet() {
67 this(new TreeMap<E,Object>());
68 }
69 
70 public boolean add(E e) {
71 return m.put(e, PRESENT)==null;
72 }
73 }
74 
75 真正的比较是依赖于元素的compareTo()方法,而这个方法是定义在 Comparable里面的。
76 所以,你要想重写该方法,就必须是先 Comparable接口。这个接口表示的就是自然排序。
77 
78  

 

TreeSet存储元素自然排序和唯一的图解

 

posted @ 2016-09-24 19:17  卡拉瓦  阅读(1383)  评论(0编辑  收藏  举报