通用队列实现
正如上一节中所提到的,LinkedList
实现了Queue
接口,用于提供先入先出(FIFO)队列操作add
,poll
等。
的 PriorityQueue
类是基于所述一个优先级队列堆的数据结构。此队列根据构造时指定的顺序对元素进行排序,这可以是元素的自然顺序或显式强加的排序Comparator
。
队列检索操作- ,,poll
和-在队列的头访问的元素。队列的头部是关于指定排序的最少元素。如果多个元素被绑定为最小值,则头部是这些元素之一; 关系被任意打破。remove
peek
element
PriorityQueue
并且它的迭代器实现了Collection
和Iterator
接口的所有可选方法。方法中提供的迭代器iterator
不保证遍历PriorityQueue
任何特定顺序的元素。对于有序遍历,请考虑使用Arrays.sort(pq.toArray())
。
并发队列实现
该java.util.concurrent
包包含一组同步的Queue
接口和类。 BlockingQueue
扩展Queue
时,在检索元素时等待队列变为非空的操作以及在存储元素时队列中的空间可用。此接口由以下类实现:
LinkedBlockingQueue
- 由链接节点支持的可选有界FIFO阻塞队列ArrayBlockingQueue
- 由数组支持的有界FIFO阻塞队列PriorityBlockingQueue
- 由堆支持的无限制阻塞优先级队列DelayQueue
- 由堆支持的基于时间的调度队列SynchronousQueue
- 使用该BlockingQueue
接口的简单集合点机制
在JDK 7中, TransferQueue
专门BlockingQueue
用于向队列添加元素的代码可以选择等待(阻塞)另一个线程中的代码来检索元素。TransferQueue
有一个实现:
LinkedTransferQueue
-TransferQueue
基于链接节点的无界。
Deque实现
通用实现包括 LinkedList
和ArrayDeque
类。该Deque
接口支持两端元素的插入,移除和检索。的 ArrayDeque
类是的可调整大小的数组实现Deque
接口,而 LinkedList
类是列表实现。
基本的插入,删除和retieval操作的Deque
界面addFirst
,addLast
,removeFirst
,removeLast
,getFirst
和getLast
。该方法addFirst
在头部addLast
添加元素,而在Deque
实例的尾部添加元素。
该LinkedList
实施比更灵活ArrayDeque
的实现。LinkedList
实现所有可选列表操作。null
在LinkedList
实现中允许元素,但在ArrayDeque
实现中不允许。
在效率方面,ArrayDeque
比LinkedList
两端的添加和删除操作更有效。实现中的最佳操作LinkedList
是在迭代期间删除当前元素。LinkedList
实现不是迭代的理想结构。
该LinkedList
实施消耗比更多的内存ArrayDeque
执行。对于ArrayDeque
实例遍历,请使用以下任何一种方法:
foreach
该foreach
速度快,可用于各种列表。
ArrayDeque <String> aDeque = new ArrayDeque <String>();
。。。
for(String str:aDeque){
的System.out.println(STR);
}
迭代器
它Iterator
可以用于各种数据列表的前向遍历。
ArrayDeque <String> aDeque = new ArrayDeque <String>();
。。。
for(Iterator <String> iter = aDeque.iterator(); iter.hasNext();){
的System.out.println(iter.next());
}
并发Deque实现
该 LinkedBlockingDeque
班是的并发执行Deque
接口。如果双端队列为空,则方法如takeFirst
并takeLast
等待,直到元素变得可用,然后检索和删除相同的元件。
代码: getlast 和getFirst 的使用
public class ArrayDequeSample {
public static void main(String[] args) {
ArrayDeque<String> aDeque = new ArrayDeque<> ();
aDeque.addFirst("tea");
aDeque.addFirst("milk");
aDeque.addFirst("coffee");
aDeque.addLast("sugar");
/* Iterate through elements in an ArrayDeque instance */
for( Iterator itr = aDeque.iterator(); itr.hasNext(); ) {
System.out.println(itr.next());
}
System.out.println();
aDeque.addFirst("juice");
aDeque.addLast("honey");
System.out.println("First Element : " + aDeque.getFirst());
System.out.println("Last Element : " + aDeque.getLast());
/* Removal of the Deque Elements */
System.out.println("First Element(Removed):"+aDeque.removeFirst());
System.out.println("Last Element Removed:"+aDeque.removeLast());
System.out.println("%nPopped Element : " + aDeque.pop());
System.out.println("%n Size of Array Deque: " + aDeque.size());
}
}