本帖最后由 王冀 于 2011-12-21 13:12 编辑
TreeSet类内部使用了一个TreeMap对象。其中使用了二叉排序树的结构。
插入新节点的方法如下:- public V put(K key, V value) {
- Entry<K,V> t = root;
- if (t == null) { //如果不存在根节点则创建一个
- root = new Entry<K,V>(key, value, null);
- size = 1;
- modCount++;
- return null;
- }
- int cmp;
- Entry<K,V> parent;
- Comparator<? super K> cpr = comparator;
- if (cpr != null) { //判断有没有比较器。
- do { //从根开始向下查找插入的位置(直到叶节点)
- parent = t;
- cmp = cpr.compare(key, t.key);
- if (cmp < 0)
- t = t.left;
- else if (cmp > 0)
- t = t.right;
- else
- return t.setValue(value);
- } while (t != null);
- }
- else {
- if (key == null)
- throw new NullPointerException();
- Comparable<? super K> k = (Comparable<? super K>) key;
- do {
- parent = t;
- cmp = k.compareTo(t.key);
- if (cmp < 0)
- t = t.left;
- else if (cmp > 0)
- t = t.right;
- else
- return t.setValue(value);
- } while (t != null);
- }
- Entry<K,V> e = new Entry<K,V>(key, value, parent); //插入新节点。
- if (cmp < 0)
- parent.left = e;
- else
- parent.right = e;
- fixAfterInsertion(e);
- size++;
- modCount++;
- return null;
- }
复制代码 |