在日常生活中吞歼,排隊幾乎隨處可見,上地鐵要排隊塔猾,買火車票要排隊篙骡,就連出門吃個大餐,也要排隊丈甸。糯俗。。之前研究的ArrayList
就像是一個缺乏管理的排隊系統(tǒng)睦擂。大家雖然會排隊得湘,但一會走個人,大家向前挪一挪顿仇,一會插個人淘正,大家向后挪一挪,碰到這樣的隊伍臼闻,一定讓人痛苦萬分吧鸿吆?
今天要介紹的Queue
就不同了,它是一個嚴(yán)格的排隊系統(tǒng)述呐。就像許多火車站排隊窗口在兩側(cè)加了護(hù)欄一樣伞剑,大家只能從隊尾進(jìn)來,從隊首離開市埋,我們稱之為FIFO(first in first out)
黎泣,也就是先進(jìn)來的人先離開。Queue
就嚴(yán)格遵循了這個原則缤谎,使插隊和提早離開變得不可能抒倚。
當(dāng)然Queue
也有很多變種,FIFO
并不是其可以遵循的唯一規(guī)則坷澡。比如Stack
(棧)托呕,就遵循LIFO(last in first out)
,這就好比我們疊碗一樣频敛,后來者居上项郊。還有我們之后要分析的Deque
,其允許元素從兩端插入或刪除斟赚,比如排隊進(jìn)站時總有人說着降,“我能不能插個隊,我趕時間拗军?”任洞。
超級接口Queue
隊列在軟件開發(fā)中擔(dān)任著重要的職責(zé)蓄喇,java函數(shù)的調(diào)用用到了棧的技術(shù),在處理并發(fā)問題時交掏,BlockingQueue
很好的解決了數(shù)據(jù)傳輸?shù)膯栴}妆偏。接下來我們看看Java是如何定義隊列的吧。
首先盅弛,Queue
也繼承自Collection
钱骂,說明它是集合家族的一員。Queue
接口主要提供了以下方法:
//將元素插入隊列
boolean add(E e);
//將元素插入隊列挪鹏,與add相比罐柳,在容量受限時應(yīng)該使用這個
boolean offer(E e);
//將隊首的元素刪除,隊列為空則拋出異常
E remove();
//將隊首的元素刪除狰住,隊列為空則返回null
E poll();
//獲取隊首元素张吉,但不移除,隊列為空則拋出異常
E element();
//獲取隊首元素催植,但不移除肮蛹,隊列為空則返回null
E peek();
超級實(shí)現(xiàn)類AbstractQueue
Queue
的定義很簡單,所以其實(shí)現(xiàn)類也很簡單创南,用簡單的代碼做復(fù)雜的事情伦忠,值得我們學(xué)習(xí)。
AbstractQueue
僅實(shí)現(xiàn)了add
稿辙、remove
和element
三個方法昆码,并且分別調(diào)用了另外一個僅細(xì)微區(qū)別的方法,我們這里只看其一
//這里我們就明白邻储,對于有容量限制的赋咽,直接調(diào)用offer肯定會更快
public boolean add(E e) {
if (offer(e))
return true;
else
throw new IllegalStateException("Queue full");
}
此外,它還實(shí)現(xiàn)了clear
與addAll
方法吨娜,重寫這些方法可以使其更符合當(dāng)前場景脓匿。
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;
}