Queue(java.util.Queue)代表着一种在尾部插入数据,从头部移除数据的数据结构,这与超市排队的工作原理类似。
Queue接口是 Java Collection 的一个子接口interface,他代表着有序的对象序和 Java List比较类似,但它的预期用途略有不同。因为Queue接口是Collection接口的子类,所以Collection接口中的所有方法Queue接口也能使用。
Queue的实现
既然Queue是个接口,那么初始化时就要使用它的具体实现,有下面两种实现:
- java.util.LinkedList
- java.util.PriorityQueue
LinkedList是一个非常标准的队列实现,元素存储在队列内部是一个标准的链表数据结构。这样可以快速的在尾部插入数据,在头部移除元素。
PriorityQueue内部存储元素的顺序是自然顺序(如果实现了Comparable),或者根据Comparator排序。
java.util.concurrent包中也有Queue的实现 。
Queue queueA = new LinkedList();Queue queueB = new PriorityQueue();
在大多数队列实现中,队列的头和尾在相反的两端,但是,可以实现队列接口,使队列的头和尾在同一头,那样的就是一个Stack了。
Queue的泛型
默认Queue中加入的Object对象,但是可以使用泛型:
Queue queue = new LinkedList();
现在Queue中只能插入MyObject对象实例,从中获取对象时不需要强制转换:
Queue queue = new LinkedList(); MyObject myObject = queue.remove(); for(MyObject anObject : queue){ //do someting to anObject...}
主要这儿在循环里面没有使用强制类型转换,因为使用了MyObject作为泛型。
Queue添加元素
Queue接口中有两个方法可以添加元素 add()和offer() ,这两个方法都在Queue的尾部加入元素,不同的是如果Queue满了, add()方法会抛异常,offer()方法会返回false:
Queue queue = new LinkedList<>(); queue.add("element 1"); queue.offer("element 2");
从Queue中取元素
可以通过 poll()或者remove()方法从Queue中取元素, poll()和remove() 方法都会移除Queue中的第一个元素,不同的是,如果Queue是个空那么 poll()方法返回null而 remove()方法会抛异常:
Queue queue = new LinkedList<>(); queue.add("element 1");queue.add("element 2"); String element1 = queue.poll(); String element2 = queue.remove();
调用poll()方法将移除队列的第一个元素 - "element 1",再调用rmove()方法将移除第二个元素,因为第一个元素被poll()移除后第二个元素变成了第一个元素- "element 2"。
从Queue中Peek
可以查看 Queue中的第一个元素通过element()或者peek()方法,element()方法将返回Queue的第一个元素,如果Queue是空, element()方法将抛NoSuchElementException,下面是例子:
Queue queue = new LinkedList<>(); queue.add("element 1");queue.add("element 2");queue.add("element 3"); String firstElement = queue.element();
执行完代码后firstElement的值是“element 1”,是 Queue中的第一个元素,peek()和element()很类似,除了当Queue 为空时不抛异常:
Queue queue = new LinkedList<>(); queue.add("element 1");queue.add("element 2");queue.add("element 3"); String firstElement = queue.peek();
从Queue中移除元素
remove()方法可以移除第一个元素:
Queue queue = new LinkedList<>(); queue.add("element 0");queue.add("element 1"); String removedElement = queue.remove();
移除Queue中的所有元素
可以通过clear() 方法移除Queue中所有元素:
queue.clear();
获取Queue的大小
可以通过size()方法获取 Queue的大小:
Queue queue = new LinkedList<>(); queue.add("element 1");queue.add("element 2");queue.add("element 3"); int size = queue.size();
执行代码后size的值是3。
检查Queue中是否包含某个元素
可以通过contains()方法检查是否包含某个元素:
Queue queue = new LinkedList<>(); queue.add("Mazda"); boolean containsMazda = queue.contains("Mazda");boolean containsHonda = queue.contains("Honda");
执行后containsMazda 的值是true,containsHonda 值是false。
迭代Queue的所有元素
下面是迭代Queue:
Queue queue = new LinkedList<>(); queue.add("element 0");queue.add("element 1");queue.add("element 2"); //access via IteratorIterator iterator = queue.iterator();while(iterator.hasNext(){ String element = iterator.next();} //access via new for-loopfor(String element : queue) { //do something with each element}
具体通过哪种方法迭代取决于Queue的具体实现。