三厅各、TreeMap和TreeSet

所有集合基于jdk1.8汽畴,對源碼稍做調(diào)整。

HashMap

主要變量

    // 比較器
    private final Comparator<? super K> comparator;
    // 根節(jié)點
    private transient Entry<K, V> root;
    // TreeMap大小
    private transient int size = 0;
    // 修改量
    private transient int modCount = 0;

構(gòu)造方法

    TreeMap() {
        this.comparator = null;
    }

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

    public TreeMap(Map<? extends K, ? extends V> m) {
        comparator = null;
        putAll(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) {
        }
    }
    

put

    public V put(K key, V value) {
        Entry<K, V> t = root;
        //當(dāng)根節(jié)點為空房资,直接賦值給根節(jié)點
        if (t == null) {
            compare(key, key);

            root = new Entry<>(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);
        }
        //比較器不存在,調(diào)用key的compare方法
        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;
        //紅黑樹實現(xiàn)
        fixAfterInsertion(e);
        size++;
        modCount++;
        return null;
    }

    /**
     * 紅黑樹實現(xiàn)
     * @param x
     */
    private void fixAfterInsertion(Entry<K, V> x) {
        //先設(shè)為紅色節(jié)點
        x.color = RED;
        //父顏色P為紅時轰异,進行變換(紅黑樹不允許分支上連續(xù)出現(xiàn)紅色節(jié)點)
        while (x != null && x != root && x.parent.color == RED) {
            //當(dāng)P在其父節(jié)點G左邊時
            if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
                //獲取G的右子樹Y
                Entry<K, V> y = rightOf(parentOf(parentOf(x)));
                //Y為紅,設(shè)P為紅岖沛,Y為黑,G為紅,G變換為X繼續(xù)迭代
                if (colorOf(y) == RED) {
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } 
                //Y為黑
                else {
                    //X在右邊時搭独,X轉(zhuǎn)換為父節(jié)點并進行左旋
                    if (x == rightOf(parentOf(x))) {
                        x = parentOf(x);
                        rotateLeft(x);
                    }
                    //將X父節(jié)點設(shè)為黑色婴削,父節(jié)點的父節(jié)點G設(shè)為紅色,并將G右旋
                    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;
    }

get

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

    final Entry<K, V> getEntry(Object key) {
        if (comparator != null)
            return getEntryUsingComparator(key);
        if (key == null)
            throw new NullPointerException();
        @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)
                p = p.left;
            else if (cmp > 0)
                p = p.right;
            else
                return p;
        }
        return null;
    }

TreeSet

TreeSet內(nèi)部維護了一個TreeMap戳稽,元素不重復(fù)也是依靠TreeMap的key值不重復(fù)實現(xiàn)的。

主要變量

    //實際元素
    private transient NavigableMap<E, Object> m;
    //充當(dāng)每個key的對應(yīng)value
    private static final Object PRESENT = new Object();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末期升,一起剝皮案震驚了整個濱河市惊奇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌播赁,老刑警劉巖颂郎,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異容为,居然都是意外死亡乓序,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門坎背,熙熙樓的掌柜王于貴愁眉苦臉地迎上來替劈,“玉大人,你說我怎么就攤上這事得滤≡上祝” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵懂更,是天一觀的道長眨业。 經(jīng)常有香客問我,道長沮协,這世上最難降的妖魔是什么龄捡? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮慷暂,結(jié)果婚禮上聘殖,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好就斤,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布悍募。 她就那樣靜靜地躺著,像睡著了一般洋机。 火紅的嫁衣襯著肌膚如雪坠宴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天绷旗,我揣著相機與錄音喜鼓,去河邊找鬼。 笑死衔肢,一個胖子當(dāng)著我的面吹牛庄岖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播角骤,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼隅忿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了邦尊?” 一聲冷哼從身側(cè)響起背桐,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蝉揍,沒想到半個月后链峭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡又沾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年弊仪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杖刷。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡励饵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滑燃,到底是詐尸還是另有隱情曲横,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布不瓶,位于F島的核電站禾嫉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚊丐。R本人自食惡果不足惜熙参,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望麦备。 院中可真熱鬧孽椰,春花似錦昭娩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锐涯,卻和暖如春磕诊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纹腌。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工霎终, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人升薯。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓莱褒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涎劈。 傳聞我的和親對象是個殘疾皇子广凸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 一谅海、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,268評論 0 16
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法坤候,內(nèi)部類的語法胁赢,繼承相關(guān)的語法企蹭,異常的語法白筹,線程的語...
    子非魚_t_閱讀 31,665評論 18 399
  • HashMap 是 Java 面試必考的知識點,面試官從這個小知識點就可以了解我們對 Java 基礎(chǔ)的掌握程度谅摄。網(wǎng)...
    野狗子嗷嗷嗷閱讀 6,669評論 9 107
  • 從三月份找實習(xí)到現(xiàn)在徒河,面了一些公司,掛了不少送漠,但最終還是拿到小米顽照、百度、阿里闽寡、京東代兵、新浪、CVTE爷狈、樂視家的研發(fā)崗...
    時芥藍閱讀 42,280評論 11 349
  • 賣肉 據(jù)說植影,呼倫貝爾大草原是世界四大草原之一,被稱為世界上最美的草原涎永。 我只是好奇思币,這是誰評出來的鹿响? 不說別的,新...
    負債如何辦閱讀 424評論 2 2