JAVA中的队列有哪些、有什么区别
Queue
实现了Collection接口
boolean add(E e); //添加元素 超出上限抛出异常 boolean offer(E e); //同样添加元素 超出上限返回false E remove(); //移除元素 为空抛出异常 E poll(); //移除元素 为空返回null E element(); //获取元素,为空抛出异常 E peek(); //获取元素,为空返回null
未实现阻塞接口(AbstractQueue)
PriorityQueue
维护了一个有序列表,插入其中的元素要么实现了 java.util.Comparable ,要么就需要在构造函数中设置比较器
ConcurrentLinkedQueue
是基于链表的线程安全的队列,因为它在队列的尾部添加元素并从头部删除它们。而这两个变量都加上了volatile关键字
private transient volatile Node<E> head; private transient volatile Node<E> tail;
实现阻塞接口(BlockingQueue)
线程不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。 aad、removee和element操作在你试图为一个已满的队列增加元素或从空队列取得元素时 抛出异常
public E element() { E x = peek(); if (x != null) return x; else throw new NoSuchElementException(); } public boolean add(E e) { if (offer(e)) return true; else throw new IllegalStateException("Queue full"); } public E remove() { E x = poll(); if (x != null) return x; else throw new NoSuchElementException(); }
ArrayBlockingQueue
一个基于数组的有界队列:内部维护了一个count字段,当count等于size的时候就不能向里面插入数据;内部维护了一个ReentrantLock可以设置公平参数为true让等待时间长的线程优先得到处理;也是按照先入先出进行排序
LinkedBlockingQueue
一个基于链表可选有界队列;在不指定容量上限的时候是没有容量限制的,按照先入先出进行排序
PriorityBlockingQueue
一个基于优先堆的无界优先级队列
DelayQueue
一个基于优先堆的、时间调度的队列。可以支持延迟获取元素的无界阻塞队列,元素必须实现Delayed接口。创建元素时可以指定多长时间后才能从队列中获取元素。
SynchronousQueue
一个基于BlockingQueue接口的简单聚集机制;是一个内部只包含一个元素的队列。每一个写操作都会被阻塞,直到一个读操作获取元素。同样每一个读操作都会被阻塞,直到一个写操作。
双端队列(Deque)
继承Queue
void addFirst(E e); //在队头部插入元速, 失败时抛出异常 void addLast(E e); //在队尾插入元素,失败时抛出异常 boolean offerFirst(E e); //向队列头部加入一个元素,失败时返回false boolean offerLast(E e); //向队列尾部加入一个元素,失败时返回false E removeFirst(); //弹出队列头部元素,队列为空时抛出异常 E removeLast(); E pollFirst(); //弹出队列头部元素,队列为空时返回null E pollLast(); E getFirst(); //获取队列头部元素,队列为空时抛出异常 E getLast(); E peekFirst(); //获取队列头部元素,队列为空时返回null E peekLast(); boolean removeFirstOccurrence(Object o); //删除第一次出现的指定元素,不存在时返回false boolean removeLastOccurrence(Object o); boolean add(E e); //队列头部元素,队列为空时抛出异常 boolean offer(E e); //队列头部元素,队列为空时抛出异常 E remove(); //删除队列头部元素,队列为空时抛出异常 E poll(); //获取并删除队列头部,如果为空返回null E element(); //获取队列头部元素,队列为空时抛出异常 E peek(); //获取队列头部元素,队列为空时返回null void push(E e); //插入元素到队列头部,插入失败排除异常 E pop(); //弹出队列头部元素,队列为空时抛出异常 boolean remove(Object o); //删除队列第一个匹配元素,队列为空时抛出异常 boolean contains(Object o); //是否包含某元素 public int size(); //队列大小 Iterator<E> iterator(); //返回队列迭代器 Iterator<E> descendingIterator(); //返回队列反向迭代器
上一篇:
IDEA上Java项目控制台中文乱码