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(); //返回队列反向迭代器

欢迎加入小编微信公众号
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值