java编程基础总结——22. Queue接口及其实现子类

一、 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(); 
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值