Queue完全解析

一 概覽

image.png

由上圖可知,Queue分成只擴展AbstractQueue的繁涂,實現(xiàn)BlockingQueue接口的膘魄,實現(xiàn)TransferQueue的昧港,實現(xiàn)BlockingDeque的以及實現(xiàn)Deque接口的五類

二 PriorityQueue

  • siftUp
    /**
     * Inserts item x at position k, maintaining heap invariant by
     * promoting x up the tree until it is greater than or equal to
     * its parent, or is the root.
     *
     * To simplify and speed up coercions and comparisons. the
     * Comparable and Comparator versions are separated into different
     * methods that are otherwise identical. (Similarly for siftDown.)
     *
     * @param k the position to fill
     * @param x the item to insert
     */
 @SuppressWarnings("unchecked")
    private void siftUpComparable(int k, E x) {
        Comparable<? super E> key = (Comparable<? super E>) x;
        while (k > 0) {  
            int parent = (k - 1) >>> 1;    //不像siftDown那樣需要考慮找左右 孩子中的最小節(jié)點,siftUp只需要比較key跟parent節(jié)點即可
            Object e = queue[parent];
            if (key.compareTo((E) e) >= 0)
                break;
            queue[k] = e;
            k = parent;
        }
        queue[k] = key;
    }
  • siftDown
    /**
     * Inserts item x at position k, maintaining heap invariant by
     * demoting x down the tree repeatedly until it is less than or
     * equal to its children or is a leaf.
     *
     * @param k the position to fill
     * @param x the item to insert
     */
    private void siftDownComparable(int k, E x) {
        Comparable<? super E> key = (Comparable<? super E>)x;
        int half = size >>> 1;        // loop while a non-leaf  先看看是不是非葉子節(jié)點
        while (k < half) {
            int child = (k << 1) + 1; // assume left child is least  先假設左孩子節(jié)點最小
            Object c = queue[child];
            int right = child + 1;
            if (right < size &&
                ((Comparable<? super E>) c).compareTo((E) queue[right]) > 0)
                c = queue[child = right];    //如果右孩子更小逻住,則將right賦給child钟哥,把queue[right]賦給c
            if (key.compareTo((E) c) <= 0) //如果目標節(jié)點值小于等于c,則break瞎访,否則腻贰,繼續(xù)循環(huán)
                break;
            queue[k] = c;
            k = child;
        }
        queue[k] = key;
    }
  • offer
    public boolean offer(E e) {
        if (e == null)
            throw new NullPointerException();
        modCount++;
        int i = size;
        if (i >= queue.length)
            grow(i + 1);    //擴容,與map和list的grow類似
        size = i + 1;
        if (i == 0)
            queue[0] = e;
        else
            siftUp(i, e);
        return true;
    }

offer(E e)方法的實現(xiàn)思路如下:
1)首先檢查要添加的元素e是否為null扒秸,如果為null播演,則拋空指針異常,如果不為null伴奥,則進行2
2)判斷數(shù)組是否已滿宾巍,如果已滿,則進行擴容渔伯,否則將元素加入到數(shù)組末尾即可顶霞。但是由于這個數(shù)組表示的是一個“二叉堆”,因此還需要進行相應的調整操作,使得這個數(shù)組在添加元素之后依然保持的是二叉堆的特性选浑。

  • poll
    public E poll() {
        if (size == 0)
            return null;
        int s = --size;
        modCount++;
        E result = (E) queue[0];
        E x = (E) queue[s];
        queue[s] = null;
        if (s != 0)
            siftDown(0, x);
        return result;
    }

poll 方法的思想為:取出 queue[0] 元素蓝厌,然后將 queue[size-1] 插入到 queue[0] , 然后向下沉來保持二叉堆的特性。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末古徒,一起剝皮案震驚了整個濱河市拓提,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隧膘,老刑警劉巖代态,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疹吃,居然都是意外死亡蹦疑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門萨驶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歉摧,“玉大人,你說我怎么就攤上這事腔呜∪拢” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵核畴,是天一觀的道長膝但。 經(jīng)常有香客問我,道長谤草,這世上最難降的妖魔是什么跟束? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮咖刃,結果婚禮上,老公的妹妹穿的比我還像新娘憾筏。我一直安慰自己嚎杨,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布氧腰。 她就那樣靜靜地躺著枫浙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪古拴。 梳的紋絲不亂的頭發(fā)上箩帚,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音黄痪,去河邊找鬼紧帕。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的是嗜。 我是一名探鬼主播愈案,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鹅搪!你這毒婦竟也來了站绪?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤丽柿,失蹤者是張志新(化名)和其女友劉穎恢准,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甫题,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡馁筐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了幔睬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眯漩。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖麻顶,靈堂內的尸體忽然破棺而出赦抖,到底是詐尸還是另有隱情,我是刑警寧澤辅肾,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布队萤,位于F島的核電站,受9級特大地震影響矫钓,放射性物質發(fā)生泄漏要尔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一新娜、第九天 我趴在偏房一處隱蔽的房頂上張望赵辕。 院中可真熱鬧,春花似錦概龄、人聲如沸还惠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚕键。三九已至,卻和暖如春衰粹,著一層夾襖步出監(jiān)牢的瞬間锣光,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工铝耻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留誊爹,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像替废,于是被迫代替她去往敵國和親箍铭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容