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 + " ");
}
}
}
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集合的更多相关文章
- 黑马程序员 Java基础<十八>---> 网路编程
--------------- ASP.Net+Android+IO开发S..Net培训.期待与您交流! --------------- 第一 概述 一.概述: 1.网络模型:OSI参考模型和TCP ...
- java基础(十八)----- java动态代理原理源码解析
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 静态代理 1.静态代理 静态代理:由程序员创建或特定工 ...
- Java实习生常规技术面试题每日十题Java基础(八)
目录 1.解释内存中的栈(stack).堆(heap)和静态区(static area)的用法. 2.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 3.运行时异常与受检异常有 ...
- java基础-IO流对象之Properties集合
java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...
- Bootstrap <基础十八>面包屑导航(Breadcrumbs)
面包屑导航(Breadcrumbs)是一种基于网站层次信息的显示方式.以博客为例,面包屑导航可以显示发布日期.类别或标签.它们表示当前页面在导航层次结构内的位置. Bootstrap 中的面包屑导航( ...
- Java基础十二--多态是成员的特点
Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...
- Java基础十--接口
Java基础十--接口 一.接口的定义和实例 /* abstract class AbsDemo { abstract void show1(); abstract void show2(); } 8 ...
- 《java面试十八式》--引子
爪哇城中 “喂,你等等我啊”少女气喘吁吁的喊道 “大小姐,你可快点吧,报名马上就要结束了.” 这是爪哇城一年一度的大选比赛,被选上的人会留下来任职,享有名誉和金钱,所以大家都在积极准备. ...
- Java集合 之 Queue集合
什么是Queue集合? 答:Queue用于模拟队列这种数据结构.队列通常是指“先进先出(FIFO)”的容器.队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素.新元素插入到队列的尾部 ...
- Java——(六)Collection之Queue集合
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Queue集合 Queue集合用于模拟队列这种数据结构,队列通常是指“先进先出‘(FIFO)的容 ...
随机推荐
- Spring boot 梳理 - SpringBoot中注入ApplicationContext对象的三种方式
直接注入(Autowired) @Configuration public class OAConfig { @Autowired private ApplicationContext applica ...
- Spring 梳理 - AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)
Spring AOP那些学术概念—通知.增强处理连接点(JoinPoint)切面(Aspect) 1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是 ...
- springboot 打包插件去除jar包瘦身
1.pom文件配置 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>s ...
- centos7 Apache开启URL重写组件并配置.htaccess实现伪静态
第一.修改httpd.conf文件 A - 在etc/httpd/conf/目录下的httpd.conf 文件,找到: LoadModule rewrite_module modules/mod_re ...
- JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式!
为什么单线程是一个限制? 在发布的第一篇文章中,思考了这样一个问题:当调用堆栈中有函数调用需要花费大量时间来处理时会发生什么? 例如,假设在浏览器中运行一个复杂的图像转换算法. 当调用堆栈有函数要执行 ...
- 解决thinkphp批量上传图片只有一张上传成功解决方案
批量上传时 存在一个生成文件名的问题 如果出现此bug,则不要用原生的生成规则来命名图片文件名 如果你试试同时上传两个不同类型,例如一张jpg,一张png,你就发现的确是可以两张同时上传的! 方案1: ...
- 视频转换器 Wondershare Video Converter Ultimate v11.5.1 中文便携版
Wondershare Video Converter Ultimate 是万兴公司出品的一款多功能音视频转换.DVD 刻录软件.视频下载软件.有了它,您可以随时随地观看.下载.编辑.转换.刻录视频, ...
- Mysql高手系列 - 第24篇:如何正确的使用索引?【高手进阶】
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第24篇. 学习索引,主要是 ...
- C#学习--Oracle数据库基本操作(连接、增、删、改、查)封装
写在前面: SQLserver的C#封装:https://www.cnblogs.com/mexihq/p/11636785.html 类似于上篇有关SQLserver的C#封装,小编对Oracle数 ...
- Kubernetes快速入门
二.Kubernetes快速入门 (1)Kubernetes集群的部署方法及部署要点 (2)部署Kubernetes分布式集群 (3)kubectl使用基础 1.简介 kubectl就是API ser ...