在平常生活中,排隊幾乎隨處可見,上地鐵要排隊,買火車票要排隊,就連出門吃個大餐,也要排隊。。。以前研究的ArrayList
就像是一個缺少管理的排隊系統。你們雖然會排隊,但一會走我的,你們向前挪一挪,一會插我的,你們向後挪一挪,碰到這樣的隊伍,必定讓人痛苦萬分吧?java
今天要介紹的Queue
就不一樣了,它是一個嚴格的排隊系統。就像許多火車站排隊窗口在兩側加了護欄同樣,你們只能從隊尾進來,從隊首離開,咱們稱之爲FIFO(first in first out)
,也就是先進來的人先離開。Queue
就嚴格遵循了這個原則,使插隊和提前離開變得不可能。併發
固然Queue
也有不少變種,FIFO
並非其能夠遵循的惟一規則。好比Stack
(棧),就遵循LIFO(last in first out)
,這就比如咱們疊碗同樣,後來者居上。還有咱們以後要分析的Deque
,其容許元素從兩端插入或刪除,好比排隊進站時總有人說,「我能不能插個隊,我趕時間?」。函數
隊列在軟件開發中擔任着重要的職責,java函數的調用用到了棧的技術,在處理併發問題時,BlockingQueue
很好的解決了數據傳輸的問題。接下來咱們看看Java是如何定義隊列的吧。學習
首先,Queue
也繼承自Collection
,說明它是集合家族的一員。Queue
接口主要提供瞭如下方法:this
//將元素插入隊列 boolean add(E e); //將元素插入隊列,與add相比,在容量受限時應該使用這個 boolean offer(E e); //將隊首的元素刪除,隊列爲空則拋出異常 E remove(); //將隊首的元素刪除,隊列爲空則返回null E poll(); //獲取隊首元素,但不移除,隊列爲空則拋出異常 E element(); //獲取隊首元素,但不移除,隊列爲空則返回null E peek();
Queue
的定義很簡單,因此其實現類也很簡單,用簡單的代碼作複雜的事情,值得咱們學習。code
AbstractQueue
僅實現了add
、remove
和element
三個方法,而且分別調用了另一個僅細微區別的方法,咱們這裏只看其一blog
//這裏咱們就明白,對於有容量限制的,直接調用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一塊兒學習討論~還有全套資源分享,經驗探討,等你哦!