Queue(java.util.Queue)代表着一种在尾部插入数据,从头部移除数据的数据结构,这与超市排队的工作原理类似。




java queue的实例化 java queue实现原理_java 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的具体实现。