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)的容 ...
随机推荐
- 【Python笔记】Python变量类型
Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...
- phaser学习总结之phaser入门教程
前言 最近公司做项目的时候正好使用到phaser,在这里做一下自己整理出来的一些心得,方便大家参考,phaser这一个游戏引擎通常是做2d游戏的,入门也非常简单,只需你会一点的javascript,但 ...
- 大家久等了,改造版阿里巴巴 sentinel 控制台终于开源了
前言 最近几天,好几个小伙伴在后台询问,改造后的 sentinel-dashboard 什么时候开源.讲真,不是不想给大家放出来,是因为一些地方还没有完善好,怕误导了大家,在经过了一个星期业余时间的努 ...
- 一文搞定 SonarQube 接入 C#(.NET) 代码质量分析
1. 前言 C#语言接入Sonar代码静态扫描相较于Java.Python来说,相对麻烦一些.Sonar检测C#代码时需要预先编译,而且C#代码必须用MSbuid进行编译,如果需要使用SonarQub ...
- Scala 学习笔记之隐式参数和隐式转换并用
隐式转换条件: 1. 当表达式类型与预期的类型不同时 2.当对象访问一个不存在的成员时 3.当对象调用某个方法,而该方法的参数声明与传入参数不相匹时. 隐式转换搜索范围: 1. 位于源火目标类型伴生对 ...
- SpringBoot注入Mapper失败
SpringBoot注入Mapper失败,可能是因为没有加扫描Mapper层的注解 方式一:在所有mapper接口使用@Mapper注解 @Mapper public interface UserMa ...
- 记一次客户DB CPU短时间内冲高至99%处理
问题背景: 客户反映DB CPU短时间内冲高,查询变得缓慢,记录此背景下的处理方式 1> 查看系统负载及相关sql 2> 查看相关sql的执行计划 3> 想看相关sql的执行计划是否 ...
- layui navTree 动态渲染菜单组件介绍
navTree.js 简介 extends/navTree.js 是一个基于 layui 扩展的模块化组件,用于构建后台布局系统中的垂直导航菜单与水平导航菜单. extends/navTree.js ...
- RAID5 配置,3块磁盘,2快备份
1. 在虚拟机中再添加5块硬盘: 2. 用fdisk -l 可以查看当前虚拟机磁盘情况. 3. 使用mdadm命令创建RAID5,名称为”/dev/md0″. -C代表创建操作,-v显示创建过程,-n ...
- CS231n:Python Numpy教程
Python 基本数据类型 容器 列表 字典 集合 元组 函数 类 Numpy 数组 访问数组 数据类型 数组计算 广播 SciPy 图像操作 MATLAB文件 点之间的距离 Matplotlib 绘 ...