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
僅實現了add
、remove
和element
三個方法,並且分別呼叫了另外一個僅細微區別的方法,我們這裡只看其一
//這裡我們就明白,對於有容量限制的,直接呼叫offer肯定會更快 public boolean add(E e) { if (offer(e)) return true; else throw new IllegalStateException("Queue full"); }
此外,它還實現了clear
與addAll
方法,重寫這些方法可以使其更符合當前場景。
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核心知識點】]
QQ討論群:616683098
QQ:3184402434
想要深入學習的同學們可以加我QQ一起學習討論~還有全套資源分享,經驗探討,等你哦!
相關推薦
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中,這就說明這是與具體平臺無關