• Queue接口

  Queue用于模拟了队列这种数据结构,队列通常是指“先进先出”(FIFO)的容器。队列的头部保存在队列中时间最长的元素,队列的尾部保存在队列中时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不容许随机访问队列中的元素。

  Queue接口中定义了如下几个方法:

  1. void add(Object e);     //将指定元素加入此队列的尾部。
  2. Object element();       //获取队列头部的元素,但是不删除该元素。
  3. boolean offer(Object e); //将指定元素加入此队列的尾部。当使用有容量限制的队列时,此方法通常比add(Object e)方法更好。
  4. Object peek();           //获取队列头部的元素,但是不删除该元素,如果此队列为空,则返回null。
  5. Object poll();                //获取队列头部的元素,并删除该元素,如果此队列为空,则返回null。
  6. Object remove();      //获取队列头部的元素,并删除该元素。

  Queue有两个常用的实现类LinkedList和PriorityQueue,下面分别介绍这两个实现类。

  • LinkedList

  LinkedList类是一个比较奇怪的类,它即是List接口的实现类,这意味着它是一个List集合,可以根据索引来随机访问集合中的元素。除此之外,LinkedList还实现了Deque接口,Deque接口是Queue接口的子接口,它代表一个双向队列,Deque接口里定义了一些可以双向操作队列的方法:

  1. void addFirst(Object e);     //将指定元素插入该双向队列的开头。
  2. void addLast(Object e);  //将指定元素插入该双向队列的末尾。
  3. Iterator descendingIterator();  //返回以该双向队列对应的迭代器,该迭代器将以逆向顺序来迭代队列中的元素。
  4. Object getFirst();      //获取、但不删除双向队列的第一个元素。
  5. Object getLast();             //获取、但不删除双向队列的最后一个元素。
  6. boolean offerFirst(Object e);//将指定元素插入该双向队列的开头
  7. boolean offerLast(Object e);//将指定元素插入该双向队列的结尾
  8. Object peekFirst();             //获取、但不删除双向队列的第一个元素;如果此双端队列为空,则返回null。
  9. Object peekLast();             //获取、但不删除该双向队列的最后一个元素;如果此双端队列为空,则返回null。
  10. Object pollFirst();              //获取、并删除双向队列的第一个元素;如果此双端队列为空,则返回null。
  11. Object pollLast();              //获取、并删除双向队列的最后一个元素,如果此双端队列为空,则返回null。
  12. Object pop();                    //pop出该双向队列所表示的栈中第一个元素。
  13. void push(Object e);          //将一个元素push进该双向队列所表示的栈中。
  14. Object removeFirst();        //获取、并删除该双向队列的第一个元素。
  15. Object removeFirstOccurrence(Object e);   //删除该双向队列的第一次的出现元素e。
  16. removeLast();                      //获取、并删除该双向队列的最后一个元素。
  17. removeLastOccurrence(Object e);    //删除该双向队列的最后一次的出现元素e

  从以上方法可以看出,LinkedList不仅可以当成双向队列使用,也可以当成“栈”使用,因为该类还包含了pop(出栈)和push(入栈)两个方法。除此之外,LinkedList实现了List接口,所以还被当成List使用。

  *建议:

  1. 如果需要遍历List集合元素,对于ArrayList、Vector集合,则应该使用随机访问方法(get)来遍历集合元素,这样性能更好,对于LinkedList集合,则应该采用迭代器(Iterater)来遍历集合元素。
  2. 如果需要经常执行插入、删除操作来改变List集合大小,则应该使用LinkedList集合,而不是ArrayList。使用ArrayList、Vector集合将需要经常重新分配内存数组的大小,其时间开销往往是使用LinkedList时时间开销的几十倍,效果很差。
  3. 如果有多条线程需要同时访问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的更多相关文章

  1. Java——集合框架之ArrayList,LinkedList,迭代器Iterator

    概述--集合框架 Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类).所有抽象出来的数据结构和操作(算法)统称为Java集合框架(Java Collection ...

  2. Java集合框架(四)

    Collections    集合框架的工具类    着重讲解以下方法: 1.sort(): 1º根据元素的自然顺序对指定列表按升序进行排序,列表中的所有元素都必须实现comparable接口. pu ...

  3. java 集合框架(四)Set

    一.概述 Set是一种没有重复元素的集合,它所有的方法都是直接继承自Collection接口,并且添加了一个对重复元素的限制.Set要求强化了equals和hashCode两个方法,以使Set集合可以 ...

  4. Java集合框架(四)-HashMap

    1.HashMap特点 存放的元素都是键值对(key-value),key是唯一的,value是可以重复的 存放的元素也不保证添加的顺序,即是无序的 存放的元素的键可以为null,但是只能有一个key ...

  5. 【java集合框架源码剖析系列】java源码剖析之LinkedList

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 在实际项目中LinkedList也是使用频率非常高的一种集合,本博客将从源码角度带领大家学习关于LinkedList的知识. ...

  6. java集合框架之LinkedList

    参考http://how2j.cn/k/collection/collection-linkedlist/370.html LinkedList 与 List接口 与ArrayList一样,Linke ...

  7. Java集合框架源码分析(2)LinkedList

    链表(LinkedList) 数组(array)和数组列表(ArrayList)都有一个重大的缺陷: 从数组的中间位置删除一个元素要付出很大的代价,因为数组中在被删除元素之后的所有元素都要向数组的前端 ...

  8. Java集合框架之LinkedList浅析

    Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...

  9. Java 集合框架(三)—— LinkedList

    三.链表 —— LinkedList ArrayList 虽然好用,但是数组和数组列表都有一个重大的缺陷:从数组的中间位置删除一个元素要付出很大的代价,其原因是数组中处于被删除元素之后的所有元素都要向 ...

  10. [转]Java - 集合框架完全解析

    数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作.Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构通常称为Java集合框架.在平常的学习开发中,灵 ...

随机推荐

  1. impala集成sentry

    1.安装配置sentry 详细步骤见上一篇安装配置sentry. 2.配置impala 注:以下配置未集成kerberos安全认证 在/etc/imapla/conf目录下创建sentry-site. ...

  2. HTML学习(二)

    表格和列表 <!-- /* @dl→definition list(定义列表),ul→unordered list(无序列表),ol→ordered list * @一个完整的表格.table. ...

  3. BSA Network Shell系列-nlogin命令

    nlogin 1 说明 nlogin 是一种通过RSCD Agent的通信的安全远程登录,使用和NSH工具相同的加密协议.可以作为telnet.rlogin或者ssh的替代工具(假如这些端口或协议禁用 ...

  4. maven-assembly-plugin插件的使用方法

    一. Assembly 是什么意思? 二. maven-assembly-plugin是什么? 它是maven中针对打包任务而提供的标准插件. 三. maven-assembly-plugin插件的作 ...

  5. Redis清空数据

    进入redis目录下 redis-cli -h IP -p 端口 -a 密码 flushall

  6. 07_jquery入门第一天

    视频来源:麦子学院 讲师:魏畅然 补充:JSON.stringify()函数 [https://www.cnblogs.com/damonlan/archive/2012/03/13/2394787. ...

  7. query返回值

    总结:PDO::query($sql)返回值是一个对象,其中包括了你输入的sql语句    而fetch()方法执行成功则返回包含一条记录的数组,失败返回false. $rs = $pdo -> ...

  8. 开发JQuery插件(转)

    教你开发jQuery插件(转)   阅读目录 基本方法 支持链式调用 让插件接收参数 面向对象的插件开发 关于命名空间 关于变量定义及命名 压缩的好处 工具 GitHub Service Hook 原 ...

  9. 使用redis所维护的代理池抓取微信文章

    搜狗搜索可以直接搜索微信文章,本次就是利用搜狗搜搜出微信文章,获得详细的文章url来得到文章的信息.并把我们感兴趣的内容存入到mongodb中. 因为搜狗搜索微信文章的反爬虫比较强,经常封IP,所以要 ...

  10. JasperReport报表开发(一)--原理介绍

    1. JasperReport介绍 JasperReport 是一个开源的Java报表引擎,它不像其他的报表工具,例如Crystal报表是基于Java的,没有自己的表达式语法.Jasper Repor ...