Java中的集合Queue、LinkedList、PriorityQueue(四)
Queue接口
Queue用于模拟了队列这种数据结构,队列通常是指“先进先出”(FIFO)的容器。队列的头部保存在队列中时间最长的元素,队列的尾部保存在队列中时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不容许随机访问队列中的元素。
Queue接口中定义了如下几个方法:
- void add(Object e); //将指定元素加入此队列的尾部。
- Object element(); //获取队列头部的元素,但是不删除该元素。
- boolean offer(Object e); //将指定元素加入此队列的尾部。当使用有容量限制的队列时,此方法通常比add(Object e)方法更好。
- Object peek(); //获取队列头部的元素,但是不删除该元素,如果此队列为空,则返回null。
- Object poll(); //获取队列头部的元素,并删除该元素,如果此队列为空,则返回null。
- Object remove(); //获取队列头部的元素,并删除该元素。
Queue有两个常用的实现类:LinkedList和PriorityQueue,下面分别介绍这两个实现类。
LinkedList
LinkedList类是一个比较奇怪的类,它即是List接口的实现类,这意味着它是一个List集合,可以根据索引来随机访问集合中的元素。除此之外,LinkedList还实现了Deque接口,Deque接口是Queue接口的子接口,它代表一个双向队列,Deque接口里定义了一些可以双向操作队列的方法:
- void addFirst(Object e); //将指定元素插入该双向队列的开头。
- void addLast(Object e); //将指定元素插入该双向队列的末尾。
- Iterator descendingIterator(); //返回以该双向队列对应的迭代器,该迭代器将以逆向顺序来迭代队列中的元素。
- Object getFirst(); //获取、但不删除双向队列的第一个元素。
- Object getLast(); //获取、但不删除双向队列的最后一个元素。
- boolean offerFirst(Object e);//将指定元素插入该双向队列的开头
- boolean offerLast(Object e);//将指定元素插入该双向队列的结尾
- Object peekFirst(); //获取、但不删除双向队列的第一个元素;如果此双端队列为空,则返回null。
- Object peekLast(); //获取、但不删除该双向队列的最后一个元素;如果此双端队列为空,则返回null。
- Object pollFirst(); //获取、并删除双向队列的第一个元素;如果此双端队列为空,则返回null。
- Object pollLast(); //获取、并删除双向队列的最后一个元素,如果此双端队列为空,则返回null。
- Object pop(); //pop出该双向队列所表示的栈中第一个元素。
- void push(Object e); //将一个元素push进该双向队列所表示的栈中。
- Object removeFirst(); //获取、并删除该双向队列的第一个元素。
- Object removeFirstOccurrence(Object e); //删除该双向队列的第一次的出现元素e。
- removeLast(); //获取、并删除该双向队列的最后一个元素。
- removeLastOccurrence(Object e); //删除该双向队列的最后一次的出现元素e
从以上方法可以看出,LinkedList不仅可以当成双向队列使用,也可以当成“栈”使用,因为该类还包含了pop(出栈)和push(入栈)两个方法。除此之外,LinkedList实现了List接口,所以还被当成List使用。
*建议:
- 如果需要遍历List集合元素,对于ArrayList、Vector集合,则应该使用随机访问方法(get)来遍历集合元素,这样性能更好,对于LinkedList集合,则应该采用迭代器(Iterater)来遍历集合元素。
- 如果需要经常执行插入、删除操作来改变List集合大小,则应该使用LinkedList集合,而不是ArrayList。使用ArrayList、Vector集合将需要经常重新分配内存数组的大小,其时间开销往往是使用LinkedList时时间开销的几十倍,效果很差。
- 如果有多条线程需要同时访问List集合中的元素,可以考虑使用Vector这个同步实现。
PriorityQueue实现类
PriorityQueue是一个比较标准的队列实现类,之所以说它是比较标准的队列实现,而不是绝对标准的队列实现是因为:PriorityQueue保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。因此当调用peek方法活着pull方法来取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。从这个意义上看,PriorityQueue已经违反了队列的最基本原则:先进先出(FIFO)。下面程序示范了PriorityQueue队列的用法。
public class Test {
public static void main(String[] args){
PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
pq.offer(3);
pq.offer(-6);
pq.offer(9);
//打印结果为[-6, 3, 9]
System.out.println(pq);
//打印结果为-6
System.out.println(pq.peek());
//打印结果为-6
System.out.println(pq.poll());
}
}
PriorityQueue不允许插入null元素,它还需要对队列元素进行排序,队列元素有两种排序方式:自然排序、定制排序; 关于使用自然排序和定制排序与前面讲到的TreeSet集合一样,读者可以查看Java集合(二)这章的内容
Java中的集合Queue、LinkedList、PriorityQueue(四)的更多相关文章
- Java中的集合Queue
2019独角兽企业重金招聘Python工程师标准>>> package com.zhaogang.test; import org.junit.Test; import java.u ...
- Java中的集合(四)PriorityQueue常用方法
Java中的集合(四)PriorityQueue常用方法 PriorityQueue的基本概念等都在上一篇已说明,感兴趣的可以点击 Java中的集合(三)继承Collection的Queue接口 查看 ...
- Java中的集合(三)继承Collection的Queue接口
Java中的集合(三)继承Collection的Queue接口 一.Queue介绍 Queue接口继承自Collection接口,是Java中定义的一种队列数据结构,元素是有序的(按插入顺序排序),先 ...
- Java中的集合(十四) Map的实现类LinkedHashMap
Java中的集合(十四) Map的实现类LinkedHashMap 一.LinkedHashMap的简介 LinkedHashMap是Map接口的实现类,继承了HashMap,它通过重写父类相关的方法 ...
- 万字长文深入理解java中的集合-附PDF下载
目录 1. 前言 2. List 2.1 fail-safe fail-fast知多少 2.1.1 Fail-fast Iterator 2.1.2 Fail-fast 的原理 2.1.3 Fail- ...
- Java中的集合类型体系(一)
Java中的集合类型体系(一) 提问:为什么需要集合? 通常情况下,程序需要根据运行时才知道创建了多少对象.若非程序运行时,而在开发阶段,我们并不知道创建了多少对象,甚至不知道对象的准确类型,为了满足 ...
- java中的集合操作类(未完待续)
申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...
- JAVA中的集合容器操作类
目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...
- Java中各种集合(字符串类)的线程安全性!!!
Java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...
随机推荐
- gRPC安装的小问题
INSTALL.md提到下述前提条件 #Pre-requisites ##Linux ```sh $ [sudo] apt-get install build-essential autoconf l ...
- Mysql:too many connect
1.问题展现应用端登录出现Too many connections报错 检查发现mysql数据库服务端已经达到了max_connections上限 #查看最大连接数 mysql> show va ...
- 【Python】【demo实验33】【练习实例】【列表的反转】
反转列表 我的源代码: #!/usr/bin/python # encoding=utf-8 # -*- coding: UTF-8 -*- #按照相反的顺序输出列表的各元素 l = ["t ...
- codeforces 1251D Salary Changing (二分+贪心)
(点击此处查看原题) 题意分析 一共有s元钱,要用这些钱给n个人发工资,发给每个人的工资si有最少和最多限制 si ∈[li,ri],在发给n个人的总工资小于s的情况下,要求发给n个人中的工资的中位数 ...
- matplotlib 画图中的basemap安装问题
在我用matplotlib画图是会用到,basemap这个库,但是直接安装却会出现问题: 使用这条安装命令就能够安装功能了: conda install -c conda-forge basemap= ...
- xtrabackup原理,整库,单表,部分备份恢复
物理备份xtrabackup原理 Percona XtraBackup(简称PXB)是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle).Pe ...
- ArrayList插入1000w条数据的时间比较分析
一分钟系列: 读懂GC日志 ArrayList插入1000w条数据之后,我怀疑了jvm... Java JIT性能调优 Java性能优化指南系列(三):理解JIT编译器 准备:调试程序加入VM Opt ...
- Sql语句知识大全
1.经典SQL语句大全(绝对的经典) 2. 3. 4.一.基础 1.1.说明:创建数据库 2.CREATE DATABASE database-name 3.2.说明:删除数据库 4.drop dat ...
- 我是如何将一个加载90s的接口优化到不足2s的
一.提出问题 由于公司是做医疗级智能可穿戴设备的,所以数据(二进制数据)的存储方面有点特殊,数据没有存储于数据库里面,而是存储于磁盘上.可能有同学质疑,mysql的Blob类型也可以存储二进制数据啊, ...
- SQL游标示例
DECLARE @@totalNum INT;SET @@totalNum=0;DECLARE @num INT;DECLARE @CustomInfo NVARCHAR(MAX);DECLARE M ...