1. 程式人生 > >Java集合原始碼分析之Queue(一):超級介面Queue_一點課堂(多岸學院)

Java集合原始碼分析之Queue(一):超級介面Queue_一點課堂(多岸學院)

在日常生活中,排隊幾乎隨處可見,上地鐵要排隊,買火車票要排隊,就連出門吃個大餐,也要排隊。。。之前研究的ArrayList就像是一個缺乏管理的排隊系統。大家雖然會排隊,但一會走個人,大家向前挪一挪,一會插個人,大家向後挪一挪,碰到這樣的隊伍,一定讓人痛苦萬分吧?

今天要介紹的Queue就不同了,它是一個嚴格的排隊系統。就像許多火車站排隊視窗在兩側加了護欄一樣,大家只能從隊尾進來,從隊首離開,我們稱之為FIFO(first in first out),也就是先進來的人先離開。Queue就嚴格遵循了這個原則,使插隊和提早離開變得不可能。

當然Queue也有很多變種,FIFO並不是其可以遵循的唯一規則。比如Stack

(棧),就遵循LIFO(last in first out),這就好比我們疊碗一樣,後來者居上。還有我們之後要分析的Deque,其允許元素從兩端插入或刪除,比如排隊進站時總有人說,“我能不能插個隊,我趕時間?”。

超級介面Queue

佇列在軟體開發中擔任著重要的職責,java函式的呼叫用到了棧的技術,在處理併發問題時,BlockingQueue很好的解決了資料傳輸的問題。接下來我們看看Java是如何定義佇列的吧。

首先,Queue也繼承自Collection,說明它是集合家族的一員。Queue介面主要提供了以下方法:

//將元素插入佇列
boolean add(E e);

//將元素插入佇列,與add相比,在容量受限時應該使用這個
boolean offer(E e);

//將隊首的元素刪除,佇列為空則丟擲異常
E remove();

//將隊首的元素刪除,佇列為空則返回null
E poll();

//獲取隊首元素,但不移除,佇列為空則丟擲異常
E element();

//獲取隊首元素,但不移除,佇列為空則返回null
E peek();

超級實現類AbstractQueue

Queue的定義很簡單,所以其實現類也很簡單,用簡單的程式碼做複雜的事情,值得我們學習。

AbstractQueue僅實現了addremoveelement三個方法,並且分別呼叫了另外一個僅細微區別的方法,我們這裡只看其一

//這裡我們就明白,對於有容量限制的,直接呼叫offer肯定會更快
public boolean add(E e) {
    if (offer(e))
        return true;
    else
        throw new IllegalStateException("Queue full");
}

此外,它還實現了clearaddAll方法,重寫這些方法可以使其更符合當前場景。

public void clear() {
    while (poll() != null)
        ;
}

public boolean addAll(Collection<? extends E> c) {
    if (c == null)
        throw new NullPointerException();
    if (c == this)
        throw new IllegalArgumentException();
    boolean modified = false;
    for (E e : c)
        if (add(e))
            modified = true;
    return modified;
}

【感謝您能看完,如果能夠幫到您,麻煩點個贊~】

更多經驗技術歡迎前來共同學習交流: 一點課堂-為夢想而奮鬥的線上學習平臺 http://www.yidiankt.com/

![關注公眾號,回覆“1”免費領取-【java核心知識點】] file

QQ討論群:616683098

QQ:3184402434

想要深入學習的同學們可以加我QQ一起學習討論~還有全套資源分享,經驗探討,等你哦! 在這裡   
 
 </div> 
 <div class=

相關推薦

Java集合原始碼分析Queue超級介面Queue_一點課堂學院

在日常生活中,排隊幾乎隨處可見,上地鐵要排隊,買火車票要排隊,就連出門吃個大餐,也要排隊。。。之前研究的ArrayList就像是一

Java集合原始碼分析LikedList

一、LinkedList結構     LinkedList是一種可以在任何位置進行高效地插入和移除操作的有序序列,它是基於雙向連結串列實現的。   LinkedList 是一個繼承於AbstractSequentialList的雙向連結串列。它也可以被當作堆疊、佇列或雙端佇列進行操作。  

Java集合原始碼分析超級介面Collection

方法定義在閱讀原始碼前,我們可以先自行想象一下,如果我們想封裝下陣列或連結串列以方便操作,我們需要封裝哪些功能呢?比如:統計大小、插入或刪除資料、清空、是否包含某條資料,等等。而Collection就是對這些常用操作進行提取,只是其很全面、很通用。下面我們看看它都提供了哪些方法。//返回集合的長度,如果長度大

Java集合原始碼分析開篇

初衷 Java集合是我們使用最頻繁的工具,也是面試的熱點,但我們對它的理解僅限於使用上,而且大多數情況沒有考慮過其使用規範。本系列文章將跟隨原始碼的思路,分析實現的每個細節,以期在使用時避免各種不規範的坑。在這裡,我們會驚豔於開發者優秀的設計,也會感激先輩

Java 集合原始碼分析HashMap

目錄 Java 集合原始碼分析(一)HashMap 1. 概要 2. JDK 7 的 HashMap 3. JDK 1.8 的 HashMap 4. Hashtable 5.

java集合原始碼分析()---整體

吐槽 這個月要把java的集合好好重新看下了,把上個月沒看的補上,突然發現自己寫了這麼久的安卓,集合那塊都忘的差不多了,自己看了下自己當時寫的集合的部落格,寫的真心爛唉。 自己當時學的時候的部落格 主要的目的是搞清楚集合底部的實現原理,和幾個的具體的區別 學習的

JAVA原始碼分析---Object類()---registerNatives,getClass方法的使用

本人java碼農一名,在工作中,萌生了分析java原始碼的想法,從今天開始,一步一步開始分析java原始碼吧。 本人閱讀jdk原始碼版本為jdk1.7。 既然是Java,那麼肯定要從最頂層的Object類開始分析。      Object全稱:java.lang.Objec

Java集合原始碼分析03----ArrayList原始碼分析

目錄   簡介 ArrayList介紹(基於jdk1.8) 原始碼分析 案例 簡介 ArrayList位置java.util包下面,是List集合的一種,底層是動態陣列,它的容量能夠動態的增長。ArrayList是非同步的,只能在單執行緒中使用。 Arr

Java集合原始碼分析02----Collection集合

目錄   Collection框架綜述 Collection介面 Set介面 List介面 Queue介面 迭代器 -----------參考《Thank In Java》 Collection框架綜述 Collection是一個介面,分為常見的

Java集合原始碼分析01----集合框架

在java.util包下面提供了一些集合類,又稱為容器。相比長度固定,存放基本資料的陣列,集合的長度是可變的,並且存放的是物件的引用。Java集合框架學習大致可以分為五個部分:List列表,Set集合,Map對映,迭代器(Iterator,Enumeration),工具類(Arrays,Collec

STL原始碼分析queue配接器

前言 上一節分析了stack實現, stack是修改了deque的介面而實現的一個功能簡單的結構, 本節分析的queue也是用deque為底層容器封裝. queue資料都是在頭部進行操作的, 之允許進行push和pop操作. queue分析 queue結構 #ifnd

java集合原始碼分析(二)---ListIterator與Iterator

吐槽 早上起來刷牙洗臉洗頭髮後,正準備去上課,然後發現今天早上好像不上課emmmmmm,然後就早上繼續看下java集合方面的原始碼了吼吼吼 Iterator 上次好像說過一點這個,然後繼續複習下這個 還是先看下官方文件 然後我們發現這個東西就是個功能很少但很

java編譯器原始碼分析詞法分析器

java編譯器是什麼? 編譯簡單理解就是一種高階語言到另一種低階語言的翻譯過程;而執行這個過程的主體稱為編譯器。尋常所說的編譯器是指把組合語言轉變成機器語言,也稱目的碼,即CPU指令集。組合語言是一種比機器語言對人友好的語言,但不同機器硬體構造不一樣,驅動機器的

Java集合原始碼分析06----Stack原始碼分析

目錄 簡介 介紹 案例 簡介     Stack模擬的是棧的操作,繼承了Vector類,底層也是通過陣列來實現的。棧的資料特點是先進後出(FILO,First In Last Out),即最後壓入棧的元素,總是第一個彈出棧。由於Stack繼承了Vector,所以

java編譯器原始碼分析語法分析器

token流到抽象語法樹的過程是語法分析。 前面認識到token流,這部分將介紹抽象語法樹(AST)。 那麼什麼是抽象語法樹(AST)?AST長啥樣?我們的token流是如何轉變成AST的?下面圍繞這三個問題展開討論。 針對什麼是抽象語法樹以及語法樹長啥樣兩個問

以太坊go-ethereum原始碼分析p2p模組()

寫了多年程式看了不少開原始碼, 大多數時候都是將知識存於腦中,偶爾做做簡單筆記, 就從這裡開始寫點詳細的技術文章吧. 以前做實時流媒體開發時就想對p2p技術做一些研究, 但是因為公司的流媒體技術使用relay伺服器中轉的模式, 所以一直沒有深入研究, 其實實時

java集合原始碼分析(四)---LinkedList

吐槽 今天看到別人說的一句話感觸蠻深的一個人把時間用到哪裡,他的成就在那裡 自己最近真的蠻浮躁的,對自己的能力莫名其妙的錯誤估計,但實際上自己的真實的水平什麼的自己還是要有點B數,既然選擇這條路的話,還是好好的自己一步一步走下去吧。 LinkedList 這個是

java集合原始碼分析(三)--ArrayList原始碼

吐槽 週末啊,冷啊啊啊啊,然後怕自己週六中午睡起來都晚上了,就不睡午覺了去實驗室看下ArrayList的原始碼。 之前自己學集合只是簡單的看了下用法,寫專案的時候雖然用這塊但是也沒仔細看下這塊到底咋實現的。 ArrayList的基本功能 首先這個貨是個陣列 陣列

spark 原始碼分析二十 -- Task的執行流程

引言 在上兩篇文章 spark 原始碼分析之十九 -- DAG的生成和Stage的劃分 和 spark 原始碼分析之二十 -- Stage的提交 中剖析了Spark的DAG的生成,Stage的劃分以及Stage轉換為TaskSet後的提交。 如下圖,我們在前兩篇文章中剖析了D

cocos2d-x3.2原始碼分析 ---- 類FileUtils實現把資源放在Resources檔案目錄下達到平臺的引用

  我以TMXTiledMap::Create函式為講解物件。   首先轉到TMXTiledMap::Create的定義中,其定義是在CCFastTMXTiledMap.cpp檔案中,程式碼1如下。其目錄是E:\mycoscos2d\test2\cocos2d\cocos\2d中,這就說明這是與具體平臺無關