Queue接口及其实现类(ArrayDeque和LinkedList)

  • Queue接口是collection的子接口,是以先进先出的方式排列元素
  • Deque接口实现双端队列,ArrayDeque和LinkedList是它的两个实现类
  • ArrayDeque类是可变数组的实现,不可存储null。LinkedList是线性表的实现,实现了线性表的所有操作,可存储null
  • PriorityDeque实现的是一种优先队列,优先队列中的元素顺序是根据元素的值排列的
  • 下面程序演示了ArrayDeque类的使用,实现双端队列
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Iterator;

/**
 * Queue接口是collection的子接口,是以先进先出的方式排列元素
 * Deque接口实现双端队列,ArrayDeque和LinkedList是它的两个实现类
 * ArrayDeque类是可变数组的实现,不可存储null。LinkedList是线性表的实现,实现了线性表的唆所有操作,可存储null
 * PriorityDeque实现的是一种优先队列,优先队列中的元素顺序是根据元素的值排列的
 * 下面程序演示了ArrayQueue类的使用,实现双端队列
 */
public class DequeDemo {
    public static void main(String[] args){
        int [] elements = {1,2,3,0,7,8,9} ;
       Deque<Integer> queue = new ArrayDeque<>() ; //实例化
        queue.addFirst(5) ;//将元素5添加到队列的头部
        for(int i=0; i<3; i++){ //将数组的前三个元素依次添加到queue中的头部
            queue.addFirst(elements[i]) ;
        }
        for(int j=4; j<7; j++){ //将数组的后3个元素添加到队列的尾部
            queue.addLast(elements[j]) ;
        }
        for(Integer m : queue){ //输出队列的元素 3,2,1,5,7,8,9
            System.out.print(m + " ") ;
        }
        System.out.println("size = " + queue.size()) ; //输出队列的大小7
        queue.add(10) ;//向队列中添加元素10
        System.out.println(queue.element()) ; //输入队列的对头元素3
        queue.remove() ; //返回队列的队头元素,同时将其移除
        queue.offer(11) ;//将指定元素11插入队列queue
        queue.offerFirst(6) ; //将指定元素6插入对头
        queue.poll() ;//返回队头元素,并将其删除
        System.out.println(queue.peek()) ; //返队头元素,但不将其删除

        Iterator <Integer> iterator = queue.iterator() ;
        while(iterator.hasNext()){ //使用迭代器方式打印队列元素
            System.out.print(iterator.next() + " ") ;
        }
        System.out.println() ;
        System.out.println(queue.getFirst() + " " + queue.getLast())  ;//得到队列的队头元素和队尾元素

    }
}
  • 队列的实现类一般不允许插入null元素,但LinkedLis类是一个例外,它允许null元素
  • 如果需要经常在线性表的头部添加元素或者内部删除元素,就应该使用LinkedList类
  • LinkedList同时实现了List接口和Queue接口
  • 下面程序使用LinkedList类实现一个10s的倒计时
import java.util.LinkedList;
import java.util.Queue;
/**
 * 队列的实现类一般不允许插入null元素,但LinkedLis类是一个例外,它允许null元素
 * 如果需要经常在线性表的头部添加元素或者内部删除元素,就应该使用LinkedList类
 * LinkedList同时实现了List接口和Queue接口
 * 下面程序使用LinkedList类实现一个10s的倒计时
 */
public class CountDown {
    public static void main(String[] args){
      int time = 10 ;
       Queue <Integer> queue = new LinkedList<>() ; //实例化
        for(int i=time; i>0; i--) { //从10到1依次存储到队列中
            queue.add(i);
        }
            while (!queue.isEmpty()) { //队列非空时循环
              System.out.println(queue.remove()); //返回队头元素,并将其删除
                try { //线程沉睡时间为1000ms
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    }
}