@(Java知识点总结)[Java, Java容器]java
Queue接口与List、Set是在同一级别,都是继承了Collection接口。LinkedList接口实现了Queue接口。Queue接口收缩了对LinkedList的方法访问权限(也就是方法参数若是是Queue,那就只能方法Queue接口定义的方法),让方法可以正确的使用。数组
队列是一种数据结构,它有两个基本操做:在队列尾部添加一个元素,和在队列头部移除一个元素。也就是说,队列以一种先进先出(FIFO)的方式操做数据。
队列,它主要分为两大类,一类是阻塞式队列,队列满了之后再插入元素则会抛出异常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。另外一种队列则是双端队列,支持在头、尾两端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。安全
方法 | 功能 | 异常处理 |
---|---|---|
add | 增长一个元索 | 若是队列已满,则抛出一个IIIegaISlabEepeplian异常 |
remove | 移除并返回队列头部的元素 | 若是队列为空,则抛出一个NoSuchElementException异常 |
element | 返回队列头部的元素 | 若是队列为空,则抛出一个NoSuchElementException异常 |
offer | 添加一个元素并返回true | 若是队列已满,则返回false |
poll | 移除并返问队列头部的元素 | 若是队列为空,则返回null |
peek | 返回队列头部的元素 | 若是队列为空,则返回null |
put | 添加一个元素 | 若是队列满,则阻塞 |
take | 移除并返回队列头部的元素 | 若是队列为空,则阻塞 |
ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
DelayQueue:一个使用优先级队列实现的无界阻塞队列。
SynchronousQueue:一个不存储元素的阻塞队列。
LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。数据结构
ConcurrentLinkedQueue :基于连接节点的无界线程安全队列测试
/** * 队列测试:实现类使用LinkedList * * Queue也有不少其余的实现类,好比java.util.concurrent.LinkedBlockingQueue。 * LinkedBlockingQueue是一个阻塞的线程安全的队列,底层实现也是使用链式结构。 */ public class TestQuene { // 定义一个队列 Queue<String> queue; @Before public void before() { // 实例化队列变量 queue = new LinkedList<String>(); // add方法向队列中添加元素,返回布尔值,add方法添加失败时会抛异常,不推荐使用 // queue.add("1"); // queue.add("2"); // queue.add("3"); // queue.add("4"); // queue.add("5"); // offer方法向队列中添加元素,返回布尔值 queue.offer("a"); queue.offer("b"); queue.offer("c"); queue.offer("d"); queue.offer("e"); } // poll方法移除队列首个元素并返回,若队列为空,返回null @Test public void test1() { // 弹出元素 String pollEle = queue.poll(); // 先进先出,弹出了a System.out.println(pollEle); // a System.out.println(queue); // [b, c, d, e] } // remove方法移除首个元素并返回,若队列为空,会抛出异常:NoSuchElementException,不推荐使用 @Test public void test2() { // 弹出元素 String remove = queue.remove(); // 先进先出,弹出了a System.out.println(remove); // a System.out.println(queue); // [b, c, d, e] } // peek方法返回队列首个元素,但不移除,若队列为空,返回null @Test public void test3() { // 查看首个元素 String peek = queue.peek(); // 首个元素是a,最早加入 System.out.println(peek); // a System.out.println(queue); // [a, b, c, d, e] } // element方法返回队列的头元素,但不移除,若队列为空,会抛出异常:NoSuchElementException,不推荐使用 @Test public void test4() { // 查看首个元素 String element = queue.element(); System.out.println(element); // a System.out.println(queue); // [a, b, c, d, e] } }