很明显它是将Map中的元素一个个put(插入)到TreeMap中的,主要因为Map中的元素是无序存放的,因此要一个个插入到红黑树中,使其有序存放,并满足红黑树的性质。
4、带有SortedMap的构造方法
[java] [view plain](() [copy](()
-
public TreeMap(SortedMap<K, ? extends V> m) {
-
comparator = m.comparator();
-
try {
-
buildFromSorted(m.size(), m.entrySet().iterator(), null, null);
-
} catch (java.io.IOException cannotHappen) {
-
} catch (ClassNotFoundException cannotHappen) {
-
}
-
}
首先将比较器指定为m的比较器,这取决于生成m时调用构造方法是否传入了指定的构造器,而后调用buildFromSorted方法,将SortedMap中的元素插入到TreeMap中,由于SortedMap中的元素师有序的,实际上它是根据SortedMap创建的TreeMap,将SortedMap中对应的元素添加到TreeMap中。
[](() 插入删除
插入操作即对应TreeMap的put方法,put操作实际上只需按照二叉排序树的插入步骤来操作即可,插入到指定位置后,再做调整,使其保持红黑树的特性。put源码的实现:
[java] [view plain](() [copy](()
-
public V put(K key, V value) {
-
Entry<K,V> t = root;
-
// 若红黑树为空,则插入根节点
-
if (t == null) {
-
// TBD:
-
// 5045147: (coll) Adding null to an empty TreeSet should
-
// throw NullPointerException
-
//
-
// compare(key, key); // type check
-
root = new Entry<K,V>(key, value, null);
-
size = 1;
-
modCount++;
-
return null;
-
}
-
int cmp;
-
Entry<K,V> parent;
-
// split comparator and comparable paths
-
Comparator<? super K> cpr = comparator;
-
// 找出(key, value)在二叉排序树中的插入位置。
-
// 红黑树是以key来进行排序的,所以这里以key来进行查找。
-
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);
-
} 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】
-
// 为(key-value)新建节点
-
Entry<K,V> e = new Entry<K,V>(key, value, parent);
-
if (cmp < 0)
-
parent.left = e;
-
else
-
parent.right = e;
-
// 插入新的节点后,调用fixAfterInsertion调整红黑树。
-
fixAfterInsertion(e);
-
size++;
-
modCount++;
-
return null;
-
}
这里的fixAfterInsertion便是节点插入后对树进行调整的方法,这里不做介绍。
删除操作及对应TreeMap的deleteEntry方法,deleteEntry方法同样也只需按照二叉排序树的操作步骤实现即可,删除指定节点后,再对树进行调整即可。deleteEntry方法的实现源码如下:
[java] [view plain](() [copy](()
-
// 删除“红黑树的节点p”
-
private void deleteEntry(Entry<K,V> p) {
-
modCount++;
-
size–;
-
if (p.left != null && p.right != null) {
-
Entry<K,V> s = succes