/**
* 批量添加元素
*/publicvoidputAll(Map<?extendsK,?extendsV> map){int mapSize = map.size();// 當該TreeMap對象中size爲0,並且傳入的SortedMap對象不爲空時if(size==0&& mapSize!=0&& map instanceofSortedMap){
Comparator<?> c =((SortedMap<?,?>)map).comparator();// comparator和SortedMap對象的比較器一致if(c == comparator ||(c != null && c.equals(comparator))){++modCount;try{buildFromSorted(mapSize, map.entrySet().iterator(), null, null);}catch(java.io.IOException cannotHappen){}catch(ClassNotFoundException cannotHappen){}return;}}// 調用父類AbstractMap中的putAll()方法super.putAll(map);}/**
* 根據傳入的SortedMap構建TreeMap對象
*/privatevoidbuildFromSorted(int size, Iterator<?> it, java.io.ObjectInputStream str, V defaultVal)throws java.io.IOException, ClassNotFoundException {this.size = size;// 根據傳入的SortedMap構建TreeMap對象實現
root =buildFromSorted(0,0, size-1,computeRedLevel(size), it, str, defaultVal);}/**
* 計算紅黑樹的高度
*/privatestaticintcomputeRedLevel(int sz){int level =0;for(int m = sz -1; m >=0; m = m /2-1)
level++;return level;}/**
* 根據傳入的SortedMap構建TreeMap對象實現
*
* @param level 樹的高度,初始值爲0
* @param lo 子樹的第一個元素的索引,初始值爲0
* @param hi 子樹的最後一個元素的索引,初始值爲size-1.
* @param redLevel 哪些節點應該是紅色的節點. 它必須和computeRedLevel方法計算出來的一樣
*/privatefinal Entry<K,V>buildFromSorted(int level,int lo,int hi,int redLevel, Iterator<?> it, java.io.ObjectInputStream str, V defaultVal)throws java.io.IOException, ClassNotFoundException {if(hi < lo)return null;int mid =(lo + hi)>>>1;
Entry<K,V> left = null;if(lo < mid)
left =buildFromSorted(level+1, lo, mid -1, redLevel,
it, str, defaultVal);
K key;
V value;if(it != null){if(defaultVal==null){
Map.Entry<?,?> entry =(Map.Entry<?,?>)it.next();
key =(K)entry.getKey();
value =(V)entry.getValue();}else{
key =(K)it.next();
value = defaultVal;}}else{// use stream
key =(K) str.readObject();
value =(defaultVal != null ? defaultVal :(V) str.readObject());}
Entry<K,V> middle =newEntry<>(key, value, null);// color nodes in non-full bottommost level redif(level == redLevel)
middle.color = RED;if(left != null){
middle.left = left;
left.parent = middle;}if(mid < hi){
Entry<K,V> right =buildFromSorted(level+1, mid+1, hi, redLevel,
it, str, defaultVal);
middle.right = right;
right.parent = middle;}return middle;}/**
* 在父類AbstractMap中的putAll()方法中,循環調用put(K key, V value)方法添加元素
*/publicvoidputAll(Map<?extendsK,?extendsV> m){// for循環調用put(key,value)方法來添加元素for(Map.Entry<?extendsK,?extendsV> e : m.entrySet())put(e.getKey(), e.getValue());}
4、remove(Object key)
/**
* 根據key來刪除Entry元素
*/public V remove(Object key){// 根據key來獲取Entry元素
Entry<K,V> p =getEntry(key);// 當Entry元素不存在時,返回nullif(p == null)return null;
V oldValue = p.value;// 根據Entry來刪除Entry元素deleteEntry(p);// 返回刪除之前的value值return oldValue;}/**
* 根據key來獲取Entry元素
*/final Entry<K,V>getEntry(Object key){if(comparator != null)returngetEntryUsingComparator(key);// 下面的代碼爲根據key實現Comparable接口重寫compareTo方法來比較key元素的方式if(key == null)thrownewNullPointerException();
Comparable<?super K> k =(Comparable<?super K>) key;
Entry<K,V> p = root;while(p != null){// 這裏cmp爲傳入的key與節點元素中的key根據key中重寫的compareTo方法所比較的大小int cmp = k.compareTo(p.key);// 根據cmp的大小來判斷遍歷左子樹還是右子樹if(cmp <0)
p = p.left;elseif(cmp >0)
p = p.right;elsereturn p;}return null;}/**
* 刪除Entry元素,並平衡紅黑樹
*/privatevoiddeleteEntry(Entry<K,V> p){
modCount++;
size--;// If strictly internal, copy successor's element to p and then make p// point to successor.if(p.left != null && p.right != null){
Entry<K,V> s =successor(p);
p.key = s.key;
p.value = s.value;
p = s;}// p has 2 children// Start fixup at replacement node, if it exists.
Entry<K,V> replacement =(p.left != null ? p.left : p.right);if(replacement != null){// Link replacement to parent
replacement.parent = p.parent;if(p.parent == null)
root = replacement;elseif(p == p.parent.left)
p.parent.left = replacement;else
p.parent.right = replacement;// Null out links so they are OK to use by fixAfterDeletion.
p.left = p.right = p.parent = null;// Fix replacementif(p.color == BLACK)fixAfterDeletion(replacement);}elseif(p.parent == null){// return if we are the only node.
root = null;}else{// No children. Use self as phantom replacement and unlink.if(p.color == BLACK)fixAfterDeletion(p);if(p.parent != null){if(p == p.parent.left)
p.parent.left = null;elseif(p == p.parent.right)
p.parent.right = null;
p.parent = null;}}}