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——集合框架之ArrayList,LinkedList,迭代器Iterator
概述--集合框架 Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类).所有抽象出来的数据结构和操作(算法)统称为Java集合框架(Java Collection ...
- Java集合框架(四)
Collections 集合框架的工具类 着重讲解以下方法: 1.sort(): 1º根据元素的自然顺序对指定列表按升序进行排序,列表中的所有元素都必须实现comparable接口. pu ...
- java 集合框架(四)Set
一.概述 Set是一种没有重复元素的集合,它所有的方法都是直接继承自Collection接口,并且添加了一个对重复元素的限制.Set要求强化了equals和hashCode两个方法,以使Set集合可以 ...
- Java集合框架(四)-HashMap
1.HashMap特点 存放的元素都是键值对(key-value),key是唯一的,value是可以重复的 存放的元素也不保证添加的顺序,即是无序的 存放的元素的键可以为null,但是只能有一个key ...
- 【java集合框架源码剖析系列】java源码剖析之LinkedList
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 在实际项目中LinkedList也是使用频率非常高的一种集合,本博客将从源码角度带领大家学习关于LinkedList的知识. ...
- java集合框架之LinkedList
参考http://how2j.cn/k/collection/collection-linkedlist/370.html LinkedList 与 List接口 与ArrayList一样,Linke ...
- Java集合框架源码分析(2)LinkedList
链表(LinkedList) 数组(array)和数组列表(ArrayList)都有一个重大的缺陷: 从数组的中间位置删除一个元素要付出很大的代价,因为数组中在被删除元素之后的所有元素都要向数组的前端 ...
- Java集合框架之LinkedList浅析
Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...
- Java 集合框架(三)—— LinkedList
三.链表 —— LinkedList ArrayList 虽然好用,但是数组和数组列表都有一个重大的缺陷:从数组的中间位置删除一个元素要付出很大的代价,其原因是数组中处于被删除元素之后的所有元素都要向 ...
- [转]Java - 集合框架完全解析
数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作.Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构通常称为Java集合框架.在平常的学习开发中,灵 ...
随机推荐
- impala集成sentry
1.安装配置sentry 详细步骤见上一篇安装配置sentry. 2.配置impala 注:以下配置未集成kerberos安全认证 在/etc/imapla/conf目录下创建sentry-site. ...
- HTML学习(二)
表格和列表 <!-- /* @dl→definition list(定义列表),ul→unordered list(无序列表),ol→ordered list * @一个完整的表格.table. ...
- BSA Network Shell系列-nlogin命令
nlogin 1 说明 nlogin 是一种通过RSCD Agent的通信的安全远程登录,使用和NSH工具相同的加密协议.可以作为telnet.rlogin或者ssh的替代工具(假如这些端口或协议禁用 ...
- maven-assembly-plugin插件的使用方法
一. Assembly 是什么意思? 二. maven-assembly-plugin是什么? 它是maven中针对打包任务而提供的标准插件. 三. maven-assembly-plugin插件的作 ...
- Redis清空数据
进入redis目录下 redis-cli -h IP -p 端口 -a 密码 flushall
- 07_jquery入门第一天
视频来源:麦子学院 讲师:魏畅然 补充:JSON.stringify()函数 [https://www.cnblogs.com/damonlan/archive/2012/03/13/2394787. ...
- query返回值
总结:PDO::query($sql)返回值是一个对象,其中包括了你输入的sql语句 而fetch()方法执行成功则返回包含一条记录的数组,失败返回false. $rs = $pdo -> ...
- 开发JQuery插件(转)
教你开发jQuery插件(转) 阅读目录 基本方法 支持链式调用 让插件接收参数 面向对象的插件开发 关于命名空间 关于变量定义及命名 压缩的好处 工具 GitHub Service Hook 原 ...
- 使用redis所维护的代理池抓取微信文章
搜狗搜索可以直接搜索微信文章,本次就是利用搜狗搜搜出微信文章,获得详细的文章url来得到文章的信息.并把我们感兴趣的内容存入到mongodb中. 因为搜狗搜索微信文章的反爬虫比较强,经常封IP,所以要 ...
- JasperReport报表开发(一)--原理介绍
1. JasperReport介绍 JasperReport 是一个开源的Java报表引擎,它不像其他的报表工具,例如Crystal报表是基于Java的,没有自己的表达式语法.Jasper Repor ...