java Queue队列相关总结

Queue:

按照添加的顺序排列,FIFO(先进先出)。
通常队列使用两个方法:offer、poll。因为如果存放或者获取失败,返回false或者null(这种情况下不要往容器中添加null),而不是抛异常(异常很讨厌额^_^)


线程不安全的队列

  • LinkedList
            --implemets Deque
        由于实现了双端队列的接口,所以“LinkedList is a Queue”。可以将其当做一个队列来使用(同样可以使用offer、poll方法)。但是它是线程不安全的。

  • PriorityQueue
    特点是有序的,每添加一个元素会按照排序规则重新排序。如何定义排序规则呢?第一种,使用默认的排序规则,即元素实现Comparable接口中的compareTo方法;第二种,使用容器自身的排序规则,初始化时传入一个Comparator,
    实现该接口的compare方法。compare的优先级高于compareTo。

线程安全的队列

  • ConcurrentLinkedQueue
    位于jdk1.5出的concurrent包下,所以这个类是线程安全的,依赖CAS机制实现(compareAndSwap:取出当前值,然后与预期值比较,如果一致,用更新值替换当前值,这一连串操作是原子操作,来源于CPU指令集)。
    属于非阻塞队列,相对于阻塞的队列来说,效率要高一些。
  • LinkedBlockingQueue

        位于jdk1.5出的concurrent包下,所以这个类是线程安全的,依赖Reentrant锁来实现。
        属于阻塞队列(使用put、take方法,如果队列已满或者已空,则一直阻塞下去)。
        属于无界队列(理论上来说是最大值为Integer.MAX_VALUE)


concurrent包下的5个阻塞对列

  •  ArrayBlockingQueue :一个由数组支持的有界队列。  
  •  LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
  •  PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
  •  DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
  • SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。

区分队列的相关集合的特点貌似有点儿困难,但是只要记住这几条黄金法则即可

  • 看到array就要想到有界
  • 看到linked就要想到first、last、无界
  • 看到bloking就要想到阻塞(阻塞的两个方法put、take)
  • 看到priorit就要想到两个接口:Comparable和Comparator

队列中几种操作

  • add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
  • remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
  • element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
  • offer 添加一个元素并返回true 如果队列已满,则返回false
  • poll 移除并返问队列头部的元素 如果队列为空,则返回null
  • peek 返回队列头部的元素 如果队列为空,则返回null
  • put 添加一个元素 如果队列满,则阻塞
  • take 移除并返回队列头部的元素 如果队列为空,则阻塞
     

猜你喜欢

转载自blog.csdn.net/qq_28411869/article/details/81539399