1、Queue : 先进先出(FIFO)的数据结构。Queue接口与List、Set同一级别,都是继承了Collection接口。
(1) Queue是最简单的队列.
(2) Queue未实现阻塞功能,并发的添加会导致一些元素添加失败.
Queue的队列一共提供了6个API: remove、element、offer、add、poll、peek。进行数据添加与获取操作属于Queue接口,但是他们都是有区别的, 因为他们会接口到其他种类的队列中,所以有必要了解一下区别:
(1) offer()方法 和 add()方法
①offer():将指定的元素插入队列(如果立即可行且不会违反容量限制),插入成功返回 true;否则返回 false。当使用有容量限制的队列时,offer()方法通常要优于add()方法——add()方法可能无法插入元素,而只是抛出一个IllegalStateException异常
②add():将指定的元素插入此队列
(2) poll()方法 和 remove()方法
①poll():获取并移除此队列的头,如果此队列为空,则返回 null
②remove():获取并移除此队列的头,如果此队列为空,则抛出NoSuchElementException异常
(3) peek()方法 和 element()方法
①peek():获取队列的头但不移除此队列的头。如果此队列为空,则返回 null
②element():获取队列的头但不移除此队列的头。如果此队列为空,则将抛出NoSuchElementException异常
2、Deque(双向队列),继承了Queue接口,是Queue的一个子接口 。大多数Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
虽然 Deque 实现没有严格要求禁止插入 null 元素,但建议最好这样做。建议任何事实上允许 null 元素的 Deque 实现用户最好不 要利用插入 null 的功能。这是因为各种方法会将null 用作特殊的返回值来指示双端队列为空。
3、PriorityQueue(优先队列)。
(1) 优先队列PriorityQueue类是Queue接口的实现实质上维护了一个有序列表。每次插入或删除元素后,都对队列进行调整,使得队列始终构成小顶堆(或大顶堆)。PriorityQueue类可以放基本数据类型的包装类(如:Integer,Long等) 或自定义的类对于基本数据类型的包装器类,优先队列中元素默认排列顺序是升序排列。但对于自己定义的类来说,需要自己定义比较器(通过java.util.Comparable 实现) 或者根据传递给构造函数的java.util.Comparator来实现。
(2) 优先队列不允许空值,而且不支持non-comparable(不可比较)的对象
(3) PriorityQueue是非线程安全的,所以Java提供了PriorityBlockingQueue(实现BlockingQueue接口)用于Java多线程环境。
(4) 优先队列的大小是不受限制的,但在创建时可以指定初始大小。当我们向优先队列增加元素的时候,队列大小会自动增加。
优先队列常用方法:
peek():返回队首元素
poll():返回队首元素,队首元素出队列
add():添加元素
size():返回队列元素个数
isEmpty():判断队列是否为空,为空返回true,不空返回false