日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java基礎之TreeMap詳解

瀏覽:229日期:2022-08-13 11:51:59
一、寫在前面

TreeMap的底層數據結構是紅黑樹,且TreeMap可以實現集合元素的排序。

所以TreeMap的源碼需要實現:

1.紅黑樹的數據結構,以及紅黑樹的節點插入,刪除,以及紅黑樹的自平衡操作,如左旋,右旋,以及節點變色

2.紅黑樹需要支持按照指定的比較器進行排序,或者進行自然排序。

二、定義

public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable

public interface NavigableMap<K,V> extends SortedMap<K,V> {

TreeMap

繼承了AbstractMap

實現了NavigableMap,而NavigableMap接口繼承了SortedMap接口,SortedMap接口表示其實現類是一個有序集合

實現了Cloneable,所以支持對象克隆

實現了Serializable,所以支持對象序列化

三、成員變量

comparator

/** * The comparator used to maintain order in this tree map, or * null if it uses the natural ordering of its keys. * * @serial */ private final Comparator<? super K> comparator;

外部指定的比較器。在創建TreeMap對象時可以指定。如果指定了比較器,則TreeMap插入鍵值對時,按照comparator比較排序。

root

private transient Entry<K,V> root;

root指代TreeMap底層紅黑樹的根節點。 root的類型Entry<K,V>就是紅黑樹節點的類型。

紅黑樹數據結構的實現就依賴于Entry<K,V>

size

/** * The number of entries in the tree */ private transient int size = 0;

表示TreeMap集合中鍵值對個數。

modCount

/** * The number of structural modifications to the tree. */ private transient int modCount = 0;

表示TreeMap集合被結構化修改的次數。用于迭代器迭代過程中檢測集合是否被結構化修改,若是,則fail-fast。

四、內部類

Entry<K,V>

Entry<K,V>是紅黑樹節點的代碼實現,是實現紅黑樹數據結構的基礎。

static final class Entry<K,V> implements Map.Entry<K,V> {K key;V value;Entry<K,V> left;Entry<K,V> right;Entry<K,V> parent;boolean color = BLACK; /** * Make a new cell with given key, value, and parent, and with * {@code null} child links, and BLACK color. */Entry(K key, V value, Entry<K,V> parent) { this.key = key; this.value = value; this.parent = parent;} /** * Returns the key. * * @return the key */public K getKey() { return key;} /** * Returns the value associated with the key. * * @return the value associated with the key */public V getValue() { return value;} /** * Replaces the value currently associated with the key with the given * value. * * @return the value associated with the key before this method was * called */public V setValue(V value) { V oldValue = this.value; this.value = value; return oldValue;} public boolean equals(Object o) { if (!(o instanceof Map.Entry))return false; Map.Entry<?,?> e = (Map.Entry<?,?>)o; return valEquals(key,e.getKey()) && valEquals(value,e.getValue());} public int hashCode() { int keyHash = (key==null ? 0 : key.hashCode()); int valueHash = (value==null ? 0 : value.hashCode()); return keyHash ^ valueHash;} public String toString() { return key + '=' + value;} }

成員變量

K key,V value分別是TreeMap集合中存儲的鍵值對的鍵和值

Entry<K,V> left 代表當前節點的左子節點

Entry<K,V> right 代表當前節點的右子節點

Entry<K,V> parent 代表當前節點的父節點

boolean color 代表當前節點的顏色,默認是黑色,為true

構造器

Entry<K,V>只提供了一個構造器 Entry(K key, V value, Entry<K,V> parent)

即:創建一個紅黑樹節點,只需要指定其存儲的鍵值信息,以及其父節點引用。不需要指定左孩子和右孩子,以及顏色。

成員方法

提供了getKey()方法返回當前節點的key值。

提供了getValue(),setValue(V v)分別用于獲取Value,以及覆蓋Value后返回oldValue

重寫了equals()方法用于判斷兩個紅黑樹節點是否相同。邏輯是:兩個紅黑樹節點的key要么都為null,要么equals結果true,且,value要么都為null,要么equals結果為true。

重寫了hashCode()方法。

重寫了toString()方法。

五、構造器

public TreeMap()

public TreeMap() {comparator = null; }

無參構造器,即不指定比較器的構造器。

注意,此時插入集合的鍵值對的key的類型必須實現Comparable接口,即提供自然排序能力,否則會報錯類型轉換異常。

public TreeMap(Comparator<? super K> comparator)

public TreeMap(Comparator<? super K> comparator) {this.comparator = comparator; }

指定比較器的構造器。

指定的比較器用于比較key,且comparator指定了泛型,即比較器比較的元素的類型必須是K或者K的父類類型。

public TreeMap(Map<? extends K, ? extends V> m)

public TreeMap(Map<? extends K, ? extends V> m) {comparator = null;putAll(m); }

將非TreeMap集合轉為TreeMap集合構造器

public TreeMap(SortedMap<K, ? extends V> m)

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) {} }

將有序Map集合轉為TreeMap集合

六、成員方法

public V get(Object key)

public V get(Object key) {Entry<K,V> p = getEntry(key);return (p==null ? null : p.value); }

TreeMap的get方法用于獲取指定key的value。如果指定key沒有對應的紅黑樹節點,則返回null,否則返回對應紅黑樹節點的value。

可以看到get方法實現依賴于getEntry(Object key)方法。

getEntry(Object key)方法是根據指定key找對應的紅黑樹節點并返回該節點。

final Entry<K,V> getEntry(Object key)

final Entry<K,V> getEntry(Object key) {// Offload comparator-based version for sake of performanceif (comparator != null)//如果外部指定了比較器 return getEntryUsingComparator(key);//則使用指定比較器來查找if (key == null)//如果外部沒有指定比較器,且要查找的key為null,則拋出空指針異常 throw new NullPointerException();@SuppressWarnings('unchecked')//此時外部沒有指定構造器,且要查的Key不為null Comparable<? super K> k = (Comparable<? super K>) key;//檢查Key的類型是否實現了Comparable接口,即是否實現了自然排序,如果實現了,則此處可以強轉成功,否則會報錯類型轉換異常Entry<K,V> p = root;while (p != null) {//從紅黑樹根節點開始使用key本身的自然排序進行比較 int cmp = k.compareTo(p.key); if (cmp < 0)//如果要查找的key小于樹節點的key,則說明要找的key在當前節點的左子樹上,則下次遍歷從左子樹的根節點開始p = p.left; else if (cmp > 0)//如果要查找的key大于樹節點的key,則說明要找的key在當前節點的右子樹上,則下次遍歷從右子樹的根節點開始p = p.right; else//如果要查找的key等于樹節點的key,則該節點就是要找的,直接返回該節點return p;}return null;//如果上面遍歷沒有找到對應Key的節點,則返回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) p = p.left;else if (cmp > 0) p = p.right;else return p; }}return null; }

Java基礎之TreeMap詳解

public V put(K key, V value)

public V put(K key, V value) {Entry<K,V> t = root;if (t == null) { compare(key, key); // type (and possibly null) check root = new Entry<>(key, value, null); size = 1; modCount++; return null;}int cmp;Entry<K,V> parent;// split comparator and comparable pathsComparator<? 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(); @SuppressWarnings('unchecked')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<>(key, value, parent);if (cmp < 0) parent.left = e;else parent.right = e;fixAfterInsertion(e);size++;modCount++;return null; }

final int compare(Object k1, Object k2) {return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2) : comparator.compare((K)k1, (K)k2); }

public V setValue(V value) { V oldValue = this.value; this.value = value; return oldValue;}

TreeMap的put方法用于插入一個鍵值對,

當插入的key在集合中不存在時,則put表示新增鍵值對,并返回null;

當插入的key在集合中存在時,則put表示覆蓋已存在key對應的value,并返回老value。

Java基礎之TreeMap詳解

private void fixAfterInsertion(Entry<K,V> x)

private void fixAfterInsertion(Entry<K,V> x) {//x是被插入的紅黑樹節點x.color = RED;//默認被插入的節點都是紅色 while (x != null && x != root && x.parent.color == RED) {//如果被插入節點不是根節點 if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {Entry<K,V> y = rightOf(parentOf(parentOf(x)));if (colorOf(y) == RED) { setColor(parentOf(x), BLACK); setColor(y, BLACK); setColor(parentOf(parentOf(x)), RED); x = parentOf(parentOf(x));} else { if (x == rightOf(parentOf(x))) {x = parentOf(x);rotateLeft(x); } setColor(parentOf(x), BLACK); setColor(parentOf(parentOf(x)), RED); rotateRight(parentOf(parentOf(x)));} } else {Entry<K,V> y = leftOf(parentOf(parentOf(x)));if (colorOf(y) == RED) { setColor(parentOf(x), BLACK); setColor(y, BLACK); setColor(parentOf(parentOf(x)), RED); x = parentOf(parentOf(x));} else { if (x == leftOf(parentOf(x))) {x = parentOf(x);rotateRight(x); } setColor(parentOf(x), BLACK); setColor(parentOf(parentOf(x)), RED); rotateLeft(parentOf(parentOf(x)));} }}root.color = BLACK;//如果被插入的節點是根節點,則節點顏色改為黑色 }

fixAfterInsertion方法用于:當TreeMap插入紅黑樹節點后,導致紅黑樹不平衡時,TreeMap保持自平衡的自旋和變色操作。

該方法的入參就是插入的紅黑樹節點。

到此這篇關于Java基礎之TreeMap詳解的文章就介紹到這了,更多相關Java TreeMap詳解內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精选成人| 亚洲va久久久噜噜噜久久| 日本精品另类| 亚洲aa在线| 最新国产精品视频| 亚洲乱亚洲高清| 日韩精品中文字幕一区二区| 日韩综合一区二区| 日韩毛片一区| 国产精品草草| 成人午夜在线| 欧美日韩视频网站| 久久国产免费| 久久福利一区| 日韩精品视频在线看| 视频一区视频二区中文字幕| 亚洲二区三区不卡| 99热精品在线| 日韩中文字幕麻豆| 亚洲bt欧美bt精品777| 色8久久久久| 国产精品一线天粉嫩av| 精品一区二区三区免费看| 日韩av有码| 亚洲香蕉网站| 丝袜美腿亚洲色图| 日韩高清在线观看一区二区| 欧美国产先锋| 日韩国产激情| 亚洲黄页一区| 欧美日韩午夜电影网| 精品视频自拍| 免费欧美一区| 热久久久久久| 日韩成人亚洲| 亚洲精品九九| 中文在线а√在线8| 国产亚洲综合精品| 日本v片在线高清不卡在线观看| 你懂的国产精品永久在线| 福利在线免费视频| 热久久久久久久| 国产精品一级在线观看| 国产一区二区视频在线看| 久久国产中文字幕| 亚洲视频二区| 国产精品最新| 99久精品视频在线观看视频| 蜜桃av一区二区| 老色鬼精品视频在线观看播放| 超碰成人av| 久热综合在线亚洲精品| 欧美1区2区3| 悠悠资源网久久精品| 国产精品一区二区免费福利视频| 国产精品国产三级国产在线观看| 亚洲国产不卡| 久久精品福利| 亚洲一区二区免费看| 国产精品永久| 国产精品婷婷| 国产精品一区亚洲| 国产一区日韩一区| 国产日韩免费| 久久精品国产68国产精品亚洲| 日韩欧美美女在线观看| 日韩电影二区| 日本欧美一区二区在线观看| 91精品国产自产在线观看永久∴| 日韩av中文字幕一区| 国产欧美一区二区色老头| 日韩欧美2区| 成人影视亚洲图片在线| 亚洲欧美日韩专区| 成人一区而且| 青青青国产精品| 久久天堂成人| 亚洲资源网站| 欧美精选视频一区二区| 欧美亚洲色图校园春色| 欧美va天堂| 久久99国产精品视频| 亚洲日韩中文字幕一区| 久久激情中文| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 高清一区二区三区| 综合一区av| 欧美成人日韩| 在线看片国产福利你懂的| 久久精品999| 一区二区三区网站| 国产在线日韩| 国产极品模特精品一二| 97久久超碰| 亚洲爱爱视频| 国产精品夜夜夜| 亚洲尤物在线| 欧美日韩色图| 98精品视频| 精品中文在线| 亚洲+小说+欧美+激情+另类| 性欧美69xoxoxoxo| 久久久精品五月天| 成人国产精品| 久久av免费| 国产日韩欧美一区二区三区| 亚洲日本国产| 一区二区电影| 亚洲自啪免费| 一本色道久久精品| 99久久视频| 成人av三级| 9999国产精品| 日韩综合一区| 中文在线中文资源| 久久av偷拍| 六月丁香综合在线视频| 日韩高清一级| 中文字幕av亚洲精品一部二部 | 7m精品国产导航在线| 国产66精品| 日韩精品一卡| 国产麻豆一区| 久久中文字幕av一区二区不卡| 嫩草伊人久久精品少妇av杨幂| 夜夜嗨网站十八久久| 日韩高清一级| 神马日本精品| 精品三区视频| 久久69成人| 卡一精品卡二卡三网站乱码| 国产精品久久免费视频| japanese国产精品| 欧美国产极品| aa国产精品| 国产99亚洲| 日本亚洲欧美天堂免费| 久久久久欧美精品| 免费精品视频| 亚洲欧洲免费| 国产欧美高清| 欧美在线综合| 91精品啪在线观看国产18| 91tv亚洲精品香蕉国产一区| 五月激情久久| 亚洲视频二区| 日韩精选在线| 国产一区二区高清| 国产麻豆精品| 久久精品高清| 欧美久久香蕉| 亚洲综合国产| 日韩精品水蜜桃| 日韩精品一区二区三区中文在线 | 国产欧美日韩影院| 亚洲精品国产嫩草在线观看| 久久久精品国产**网站| 欧美一区二区三区激情视频| 丝袜美腿一区二区三区| 国产精品激情| se01亚洲视频 | 不卡在线一区二区| 亚洲色图网站| 日本久久二区| 国产伦理久久久久久妇女| 亚洲青青久久| 欧洲在线一区| 日本色综合中文字幕| 激情欧美一区二区三区| 久久久噜噜噜| 欧洲激情综合| 日韩国产在线一| 一区二区国产在线| 国产精品久久久免费| 日韩电影免费网站| 日韩va欧美va亚洲va久久| 亚洲一区二区毛片| 婷婷综合一区| 五月天av在线| 啪啪国产精品| 亚洲18在线| 日韩精品免费视频人成| 一区二区三区国产盗摄| 激情欧美一区二区三区| 婷婷丁香综合| 亚洲小说欧美另类婷婷| 亚洲精品进入| 国产精品88久久久久久| 超碰在线99| 久久女人天堂| 国产伦理一区| 麻豆久久久久久| xxxxx性欧美特大| 国产精品美女在线观看直播 | 热久久久久久| 国产精品88久久久久久| 理论片午夜视频在线观看| 精品高清久久| 久久中文字幕av一区二区不卡| 日韩av首页|