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<MyObject> queue = new LinkedList<MyObject>();
现在Queue
中只能插入MyObject对象实例,从中获取对象时不需要强制转换:
Queue<MyObject> queue = new LinkedList<MyObject>();
MyObject myObject = queue.remove();
for(MyObject anObject : queue){
//do someting to anObject...
}
主要这儿在循环里面没有使用强制类型转换,因为使用了MyObject
作为泛型。
Queue添加元素
Queue接口中有两个方法可以添加元素 add()
和offer()
,这两个方法都在Queue的尾部加入元素,不同的是如果Queue满了, add()
方法会抛异常,offer()方法会返回false:
Queue<String> queue = new LinkedList<>();
queue.add("element 1");
queue.offer("element 2");
从Queue中取元素
可以通过 poll()
或者remove()
方法从Queue中取元素, poll()
和remove() 方法都会移除Queue
中的第一个元素
,不同的是,如果Queue是个空那么 poll()
方法返回null
而 remove()方法会抛异常:
Queue<String> 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<String> 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<String> queue = new LinkedList<>();
queue.add("element 1");
queue.add("element 2");
queue.add("element 3");
String firstElement = queue.peek();
从Queue中移除元素
remove()
方法可以移除第一个元素:
Queue<String> queue = new LinkedList<>();
queue.add("element 0");
queue.add("element 1");
String removedElement = queue.remove();
移除Queue中的所有元素
可以通过clear()
方法移除Queue中所有元素:
queue.clear();
获取Queue的大小
可以通过size()
方法获取
Queue的大小:
Queue<String> queue = new LinkedList<>();
queue.add("element 1");
queue.add("element 2");
queue.add("element 3");
int size = queue.size();
执行代码后size
的值是3
。
检查Queue中是否包含某个元素
可以通过contains()
方法检查是否包含某个元素:
Queue<String> queue = new LinkedList<>();
queue.add("Mazda");
boolean containsMazda = queue.contains("Mazda");
boolean containsHonda = queue.contains("Honda");
执行后containsMazda
的值是true,containsHonda
值是false。
迭代Queue的所有元素
下面是迭代Queue
:
Queue<String> queue = new LinkedList<>();
queue.add("element 0");
queue.add("element 1");
queue.add("element 2");
//access via Iterator
Iterator<String> iterator = queue.iterator();
while(iterator.hasNext(){
String element = iterator.next();
}
//access via new for-loop
for(String element : queue) {
//do something with each element
}
具体通过哪种方法迭代取决于Queue的具体实现。