具體的LinkedList數據結構參考這個鏈接 隊列用法主要來自於Deque,而Deque又繼承自Queue 先從下麵一段代碼說起吧 如果對於隊列的數據結構不瞭解的話,對上面的註釋內容會比較迷糊。Queue介面主要是使LinkedList具有隊列的能力。隊列類似於我們生活中的排隊;特點就是先進先出, ...
隊列用法主要來自於Deque,而Deque又繼承自Queue
先從下麵一段代碼說起吧
public static void main(String[] args) { Queue<String> queue=new LinkedList<>(); queue.offer("張三");//隊列尾部添加元素 queue.offer("李四"); queue.offer("王五"); while (queue.peek()!=null){//返回頭部信息,不改變隊列 System.out.println(queue.poll());//返回頭部元素,改變隊列 }
如果對於隊列的數據結構不瞭解的話,對上面的註釋內容會比較迷糊。
Queue介面主要是使LinkedList具有隊列的能力。
隊列類似於我們生活中的排隊;特點就是先進先出,在尾部添加元素,從頭部刪除元素。
boolean add(E e);在隊列尾部添加元素;(當隊列滿時,會拋出異常;我從源碼中並沒有看到拋異常的代碼,希望知情者告知一聲)
boolean offer(E e);在隊列尾部添加元素,隊列滿時不會拋異常,只是返回false
調用的就是上面的add方法
E remove();刪除隊列中頭部元素,如果是空隊列,會拋異常。
E poll();刪除頭部元素,如果隊列為空,不會拋異常,會返回null
E element();查看頭部信息,如果空隊列會拋異常
E peek();查看頭部信息,空隊列返回你null
說了了Queue隊列的數據結構,那麼Deque具體賦予了LinkeList什麼能力了呢。
因為Deque是介面,那麼本身並沒有實現Queue方法的能力。所以可以斷定Deque只是擴展了Queue。
Deque<String> deque=new LinkedList<>(); deque.offer("張三");//隊列尾部添加元素 deque.offer("李四"); deque.offer("王五"); deque.addFirst("老郭"); deque.addLast("老王"); while (deque.peek()!=null){//返回頭部信息,不改變隊列 System.out.print(deque.poll()+" ");//返回頭部元素,改變隊列 //列印結果:老郭 張三 李四 王五 老王 }
從上面的代碼我們知道可以在任何地方將元素添加到隊列頭。
這與上面的Queue的數據結構就不相同了
上面的代碼根據方法名結合著Queue的幾個方法名,可以知道具體用法;不做贅述了。
如果把Queue比作排隊的話,那麼Deque就帶插隊的功能了;不光可以在隊尾加元素;還可以在隊頭插入元素;
並且只能插到隊頭,無法插到隊中間。
我們把Queue稱作隊列,Deque稱作雙端隊列。
隊列和棧數據結構的區別:
1.隊列能操作兩端;而棧只操作頭部。
2.隊列是先進先出,而棧是先進後出。
從上面的隊列和棧的區別可以發現,他們的實現方法在Deque中都能找到,或者說是雙端隊列的特殊情況。
順便說一下java中沒有單獨的棧介面,但是有一個Stack類;它繼承子Vercor這個類。
Statck也實現了棧數據的一些方法,但是和Deque是有本質區別的。
Statck中添加元素是線程安全的;LinkedList不是線程安全的;
Statck操作的是數組;LinkedList操作的是鏈表結構的數據。
1.在不需要線程安全的情況下,完全可以使用Deque deque=new LinkedList<>()代替。
2.另外Deque deque=new LinkedList<>()也可以代替Queue queue=new LinkedList<>();