TreeMap方法源码
生活随笔
收集整理的這篇文章主要介紹了
TreeMap方法源码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
構造方法
public TreeMap() {comparator = null; }/*** 使用傳入的comparator比較兩個key的大小*/ public TreeMap(Comparator<? super K> comparator) {this.comparator = comparator; }/*** key必須實現Comparable接口,把傳入map中的所有元素保存到新的TreeMap中*/ public TreeMap(Map<? extends K, ? extends V> m) {comparator = null;putAll(m); }/*** 使用傳入map的比較器,并把傳入map中的所有元素保存到新的TreeMap中*/ 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) {} }獲取元素
public V get(Object key) {// 根據key查找元素Entry<K,V> p = getEntry(key);// 找到了返回value值,沒找到返回nullreturn (p==null ? null : p.value); }final Entry<K,V> getEntry(Object key) {// 如果comparator不為空,使用comparator的版本獲取元素if (comparator != null)return getEntryUsingComparator(key);// 如果key為空返回空指針異常if (key == null)throw new NullPointerException();// 將key強轉為Comparable@SuppressWarnings("unchecked")Comparable<? super K> k = (Comparable<? super K>) key;// 從根元素開始遍歷Entry<K,V> p = root;while (p != null) {int cmp = k.compareTo(p.key);if (cmp < 0)// 如果小于0從左子樹查找p = p.left;else if (cmp > 0)// 如果大于0從右子樹查找p = p.right;else// 如果相等說明找到了直接返回return p;}// 沒找到返回nullreturn null; }final Entry<K,V> getEntryUsingComparator(Object key) {@SuppressWarnings("unchecked")K k = (K) key;Comparator<? super K> cpr = comparator;if (cpr != null) {// 從根元素開始遍歷Entry<K,V> p = root;while (p != null) {int cmp = cpr.compare(k, p.key);if (cmp < 0)// 如果小于0從左子樹查找p = p.left;else if (cmp > 0)// 如果大于0從右子樹查找p = p.right;else// 如果相等說明找到了直接返回return p;}}// 沒找到返回nullreturn null; }插入元素?
public V put(K key, V value) {Entry<K,V> t = root;if (t == null) {// 如果沒有根節點,直接插入到根節點compare(key, key); // type (and possibly null) checkroot = new Entry<>(key, value, null);size = 1;modCount++;return null;}// key比較的結果int cmp;// 用來尋找待插入節點的父節點Entry<K,V> parent;// 根據是否有comparator使用不同的分支Comparator<? super K> cpr = comparator;if (cpr != null) {// 如果使用的是comparator方式,key值可以為null,只要在comparator.compare()中允許即可// 從根節點開始遍歷尋找do {parent = t;cmp = cpr.compare(key, t.key);if (cmp < 0)// 如果小于0從左子樹尋找t = t.left;else if (cmp > 0)// 如果大于0從右子樹尋找t = t.right;else// 如果等于0,說明插入的節點已經存在了,直接更換其value值并返回舊值return t.setValue(value);} while (t != null);}else {// 如果使用的是Comparable方式,key不能為nullif (key == null)throw new NullPointerException();@SuppressWarnings("unchecked")Comparable<? super K> k = (Comparable<? super K>) key;// 從根節點開始遍歷尋找do {parent = t;cmp = k.compareTo(t.key);if (cmp < 0)// 如果小于0從左子樹尋找t = t.left;else if (cmp > 0)// 如果大于0從右子樹尋找t = t.right;else// 如果等于0,說明插入的節點已經存在了,直接更換其value值并返回舊值return t.setValue(value);} while (t != null);}// 如果沒找到,那么新建一個節點,并插入到樹中Entry<K,V> e = new Entry<>(key, value, parent);if (cmp < 0)// 如果小于0插入到左子節點parent.left = e;else// 如果大于0插入到右子節點parent.right = e;// 插入之后的平衡fixAfterInsertion(e);// 元素個數加1(不需要擴容)size++;// 修改次數加1modCount++;// 如果插入了新節點返回空return null; }總結
以上是生活随笔為你收集整理的TreeMap方法源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大话HashMap的put,get过程
- 下一篇: 大话TreeMap的put,get过程