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

  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 + " ");
}
}
}

  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

Java基础(十八)集合(5)Queue集合的更多相关文章

  1. 黑马程序员 Java基础<十八>---> 网路编程

    --------------- ASP.Net+Android+IO开发S..Net培训.期待与您交流! --------------- 第一  概述 一.概述: 1.网络模型:OSI参考模型和TCP ...

  2. java基础(十八)----- java动态代理原理源码解析

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 静态代理 1.静态代理 静态代理:由程序员创建或特定工 ...

  3. Java实习生常规技术面试题每日十题Java基础(八)

    目录 1.解释内存中的栈(stack).堆(heap)和静态区(static area)的用法. 2.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 3.运行时异常与受检异常有 ...

  4. java基础-IO流对象之Properties集合

    java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...

  5. Bootstrap <基础十八>面包屑导航(Breadcrumbs)

    面包屑导航(Breadcrumbs)是一种基于网站层次信息的显示方式.以博客为例,面包屑导航可以显示发布日期.类别或标签.它们表示当前页面在导航层次结构内的位置. Bootstrap 中的面包屑导航( ...

  6. Java基础十二--多态是成员的特点

    Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...

  7. Java基础十--接口

    Java基础十--接口 一.接口的定义和实例 /* abstract class AbsDemo { abstract void show1(); abstract void show2(); } 8 ...

  8. 《java面试十八式》--引子

    爪哇城中   “喂,你等等我啊”少女气喘吁吁的喊道   “大小姐,你可快点吧,报名马上就要结束了.”   这是爪哇城一年一度的大选比赛,被选上的人会留下来任职,享有名誉和金钱,所以大家都在积极准备. ...

  9. Java集合 之 Queue集合

    什么是Queue集合? 答:Queue用于模拟队列这种数据结构.队列通常是指“先进先出(FIFO)”的容器.队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素.新元素插入到队列的尾部 ...

  10. Java——(六)Collection之Queue集合

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Queue集合 Queue集合用于模拟队列这种数据结构,队列通常是指“先进先出‘(FIFO)的容 ...

随机推荐

  1. 【Python笔记】Python变量类型

    Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...

  2. phaser学习总结之phaser入门教程

    前言 最近公司做项目的时候正好使用到phaser,在这里做一下自己整理出来的一些心得,方便大家参考,phaser这一个游戏引擎通常是做2d游戏的,入门也非常简单,只需你会一点的javascript,但 ...

  3. 大家久等了,改造版阿里巴巴 sentinel 控制台终于开源了

    前言 最近几天,好几个小伙伴在后台询问,改造后的 sentinel-dashboard 什么时候开源.讲真,不是不想给大家放出来,是因为一些地方还没有完善好,怕误导了大家,在经过了一个星期业余时间的努 ...

  4. 一文搞定 SonarQube 接入 C#(.NET) 代码质量分析

    1. 前言 C#语言接入Sonar代码静态扫描相较于Java.Python来说,相对麻烦一些.Sonar检测C#代码时需要预先编译,而且C#代码必须用MSbuid进行编译,如果需要使用SonarQub ...

  5. Scala 学习笔记之隐式参数和隐式转换并用

    隐式转换条件: 1. 当表达式类型与预期的类型不同时 2.当对象访问一个不存在的成员时 3.当对象调用某个方法,而该方法的参数声明与传入参数不相匹时. 隐式转换搜索范围: 1. 位于源火目标类型伴生对 ...

  6. SpringBoot注入Mapper失败

    SpringBoot注入Mapper失败,可能是因为没有加扫描Mapper层的注解 方式一:在所有mapper接口使用@Mapper注解 @Mapper public interface UserMa ...

  7. 记一次客户DB CPU短时间内冲高至99%处理

    问题背景: 客户反映DB CPU短时间内冲高,查询变得缓慢,记录此背景下的处理方式 1> 查看系统负载及相关sql 2> 查看相关sql的执行计划 3> 想看相关sql的执行计划是否 ...

  8. layui navTree 动态渲染菜单组件介绍

    navTree.js 简介 extends/navTree.js 是一个基于 layui 扩展的模块化组件,用于构建后台布局系统中的垂直导航菜单与水平导航菜单. extends/navTree.js ...

  9. RAID5 配置,3块磁盘,2快备份

    1. 在虚拟机中再添加5块硬盘: 2. 用fdisk -l 可以查看当前虚拟机磁盘情况. 3. 使用mdadm命令创建RAID5,名称为”/dev/md0″. -C代表创建操作,-v显示创建过程,-n ...

  10. CS231n:Python Numpy教程

    Python 基本数据类型 容器 列表 字典 集合 元组 函数 类 Numpy 数组 访问数组 数据类型 数组计算 广播 SciPy 图像操作 MATLAB文件 点之间的距离 Matplotlib 绘 ...