天天看点

LinkedList的队列用法

具体的LinkedList数据结构参考这个链接

队列用法主要来自于Deque,而Deque又继承自Queue

LinkedList的队列用法
先从下面一段代码说起吧

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具有队列的能力。

队列类似于我们生活中的排队;特点就是先进先出,在尾部添加元素,从头部删除元素。

LinkedList的队列用法

boolean add(E e);在队列尾部添加元素;(当队列满时,会抛出异常;我从源码中并没有看到抛异常的代码,希望知情者告知一声)

LinkedList的队列用法

boolean offer(E e);在队列尾部添加元素,队列满时不会抛异常,只是返回false

LinkedList的队列用法

调用的就是上面的add方法

E remove();删除队列中头部元素,如果是空队列,会抛异常。

LinkedList的队列用法

E poll();删除头部元素,如果队列为空,不会抛异常,会返回null

LinkedList的队列用法

E element();查看头部信息,如果空队列会抛异常

LinkedList的队列用法

E peek();查看头部信息,空队列返回你null

LinkedList的队列用法

说了了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的数据结构就不相同了

LinkedList的队列用法

上面的代码根据方法名结合着Queue的几个方法名,可以知道具体用法;不做赘述了。

如果把Queue比作排队的话,那么Deque就带插队的功能了;不光可以在队尾加元素;还可以在队头插入元素;

并且只能插到队头,无法插到队中间。

我们把Queue称作队列,Deque称作双端队列。

队列和栈数据结构的区别:

1.队列能操作两端;而栈只操作头部。

2.队列是先进先出,而栈是先进后出。

从上面的队列和栈的区别可以发现,他们的实现方法在Deque中都能找到,或者说是双端队列的特殊情况。

顺便说一下java中没有单独的栈接口,但是有一个Stack类;它继承子Vercor这个类。

LinkedList的队列用法

Statck也实现了栈数据的一些方法,但是和Deque是有本质区别的。

LinkedList的队列用法

Statck中添加元素是线程安全的;LinkedList不是线程安全的;

LinkedList的队列用法

Statck操作的是数组;LinkedList操作的是链表结构的数据。

1.在不需要线程安全的情况下,完全可以使用Deque deque=new LinkedList<>()代替。

2.另外Deque deque=new LinkedList<>()也可以代替Queue queue=new LinkedList<>();