Java基础(十八)集合(5)Queue集合

  队列是只能在尾部添加元素,同时只能在头部删除元素的数据结构。队列的原则就是“先进先出”。

  Queue接口是Collection接口的最后一个子接口。

  Queue接口是队列接口,而Deque接口是Queue接口的子接口,可以用来实现双端队列,让人们有效地在头部和尾部同时添加或删除元素。

  ArrayDeque和LinkedList都实现了Deque接口。

  实现了Queue接口的类有两种:ArrayDeque类和PriorityQueue类。

  队列一般有两种实现方式,数组队列和链表队列。

  如果需要一个循环数组队列,就可以使用ArrayDeque类;如果需要一个链表队列,就直接使用LinkedList类,这个类实现了Queue接口。

   1.ArrayDeque(循环数组队列)

  创建一个ArrayDeque对象:

ArrayDeque<String> aDeque = new ArrayDeque<>();

  方法测试:

package queue.jun.iplab;

import java.util.ArrayDeque;
import java.util.Iterator;

public class ArrayDequeTest {

    public static void main(String[] args) {
        
        String a = "A", b = "B", c = "C", d = "D", e = "E";
        ArrayDeque<String> aDeque = new ArrayDeque<>();
        aDeque.add(a);
        aDeque.add(b);
        aDeque.addFirst(c);
        aDeque.addLast(d);
        System.out.println(aDeque.isEmpty()); // 打印:false
        
        Iterator<String> it = aDeque.iterator();
        while (it.hasNext()) {                           // 打印:(队头)C A B D
            String string = (String) it.next();
            System.out.print(string + " ");
        }
        System.out.println();
        
        System.out.println(aDeque.poll());      // 打印:C
        System.out.println(aDeque.peek());   // 打印:A
        System.out.println(aDeque.peekLast());  // 打印:D
        System.out.println(aDeque.pop());          // 打印:A
        
        Iterator<String> it_1 = aDeque.iterator();
        while (it_1.hasNext()) {              // 打印:B D
            String string = (String) it_1.next();
            System.out.print(string + " ");
        }
    }
}
View Code

  2.PriorityQueue(高效删除最小元素队列)

  优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索。

  优先级队列使用了堆,对二叉树进行添加和删除操作,可以让最小的元素移动到根,而不必花费时间对元素进行排序。

  与TreeSet一样,一个优先级队列既可以保存实现了Comparable接口的类对象,也可以保存在构造器中提供的Comparator对象。

  保存在PriorityQueue中的对象必须实现Comparator接口:

public class Person implements Comparable<Object> {
    private String name;
    private long id_card; }

  以id_card的大小为排序指标,然后重写compareTo方法

    // 重写compareTo方法,按照id_card的大小进行比较,如果大的返回1,等于返回0,小于返回-1
    @Override
    public int compareTo(Object o) {
        Person person = (Person) o;
        int result = id_card > person.id_card ? 1 : (id_card == person.id_card ? 0 : -1);
        return result;
    }

  创建一个PriorityQueue对象:

PriorityQueue<Person> pQueue = new PriorityQueue<>();

  插入五个元素:

        Person person1 = new Person("小一", 13311123);
        Person person2 = new Person("小二", 13223131);
        Person person3 = new Person("小三", 13432412);
        Person person4 = new Person("小四", 13621312);
        Person person5 = new Person("小五", 13531231);
        
        PriorityQueue<Person> pQueue = new PriorityQueue<>();
        pQueue.add(person1);
        pQueue.add(person2);
        pQueue.add(person3);
        pQueue.add(person4);
        pQueue.add(person5);

  使用迭代器访问时,不是按照元素的排列顺序访问的,而是最先访问最小的元素,然后剩余元素按照插入顺序访问:

        Iterator<Person> it = pQueue.iterator();
        while (it.hasNext()) {
            Person person = (Person) it.next();
            System.out.println(person.getName() + " " + person.getId_card());
        }

输出:
小二 13223131
小一 13311123
小三 13432412
小四 13621312
小五 13531231

  而执行删除操作时,却总是删除掉剩余元素中优先级最小的那个元素。

        while (!pQueue.isEmpty()) {
            System.out.println(pQueue.remove().getId_card());
        }

输出:
13223131
13311123
13432412
13531231
13621312
posted @ 2018-08-02 16:17  BigJunOba  阅读(252)  评论(0编辑  收藏  举报