一、 Queue接口
除了基本的
Collection
操作外,队列还提供其他的插入、提取和检查操作。每个方法都存在
两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(
null
或
false
,具体取决于
操作)。插入操作的后一种形式是用于专门为有容量限制的
Queue
实现设计的;在大多数实现中, 插入操作不会失败
队列通常(但并非一定)以
FIFO
(先进先出)的方式排序各个元素。不过优先级队列和
LIFO
队列
(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按
LIFO
(后进先
出)的方式对元素进行排序。无论使用哪种排序方式,队列的
头
都是调用
remove()
或
poll()
所移除的元素。在
FIFO
队列中,所有的新元素都插入队列的
末尾
。其他种类的队列可能使用不同的元
素放置规则。每个
Queue
实现必须指定其顺序属性。
Queue
实现通常不允许插入
null
元素,(失败时返回值有null)尽管某些实现(如
LinkedList
)并不禁止插入
null
。
二、Queue接口实现子类
Queue的实现子类主要有:
LinkedList(上一篇已经讲过)
ArrayDeque
PriorityQueue
这里讲解PriorityQueue
PriorityQueue
一个基于优先级堆的无界优先级队列
。优先级队列的元素按照其
自然顺序
进行排序,或者根据构
造队列时提供的
Comparator
进行排序。
优先级队列不允许使用
null
元素。依靠自然顺序的优先级队列还不允许插入不可比较的对象。
此队列的
头
是按指定排序方式确定的
最小
元素。如果多个元素都是最小值,则头是其中一个元
素
——
选择方法是任意的。队列获取操作
poll
、
remove
、
peek
和
element
访问处于队列头
的元素。
优先级队列是无界的,但是有一个内部
容量
,控制着用于存储队列元素的数组大小。它通常至少
等于队列的大小。随着不断向优先级队列添加元素,其容量会自动增加。
此实现不是同步的。
@Test
void testQueue() {
Queue<Integer> nums = new LinkedList<>();
nums.offer(22);
nums.offer(33);
nums.offer(88);
nums.offer(55);
nums.offer(0);
nums.offer(11);
System.out.println(nums);
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
}
PriorityQueue和LinkedList不一样,它不是按进队的先后顺序进行存储的
1. 数字
@Test
void testPriorityQueue() {
Queue<Integer> nums = new PriorityQueue<>();
nums.offer(12);
nums.offer(33);
nums.offer(88);
nums.offer(55);
nums.offer(0);
nums.offer(11);
System.out.println(nums);
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
}
2. 字符串
@Test
void testPriorityQueue02() {
Queue<String> nums = new PriorityQueue<>();
nums.offer("liujianhong");
nums.offer("123456");
nums.offer("liushuaige");
nums.offer("haha");
nums.offer("zs");
nums.offer("ww");
System.out.println(nums);
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
}
3. 对象
若Person未实现Comparable接口
@Test
void testPriorityQueue03() {
Queue<Person> nums = new PriorityQueue<>();
nums.offer(new Person(1, "cc", "曹孟德", "男", 32));
nums.offer(new Person(2, "lb", "刘玄德", "男", 28));
nums.offer(new Person(3, "sq", "孙百万", "男", 18));
nums.offer(new Person(4, "zf", "张翼德", "男", 24));
nums.offer(new Person(5, "gy", "关云长", "男", 26));
nums.offer(new Person(6, "hhd", "夏侯惇", "男", 43));
nums.offer(new Person(7, "lb", "吕奉先", "男", 23));
nums.offer(new Person(8, "dc", "貂蝉", "男", 16));
System.out.println(nums);
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
System.out.println(nums.poll());
}
若Person实现了Comparable接口就可以定义规则,与下篇的TreeSet一样
@Override
public int compareTo(Person o) {
// 指定需要排序的规则!!!// 指定规则:id的升序排列
// return this.getId() - o.getId();
// 指定规则:age的降序排列
return o.getAge() - this.getAge();
}