具體的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<>();