队列用法主要来自于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<>();