队列-ConcurrentLinkedQueue

基本概念

队列:

特点:先进先出

用数组实现的栈叫作顺序栈,用链表实现的栈叫作链式栈。

同样,用数组实现的队列叫作顺序队列,用链表实现的队列叫作链式队列.

最基本的两个操作:

入队 enqueue(),放一个数据到队列尾部;

出队 dequeue(),从队列头部取一个元素。

队列需要两个指针:一个是 head 指针,指向队头;一个是 tail 指针,指向队尾。

1.阻塞队列:

在队列的基础上增加了阻塞操作.简单来说就是:

队列为空的时候,从队列头取数据不会被阻塞,因为此时还没有数据可取,直到队列中有数据了才返回;

如果队列已经满了,那么插入数据的操作会被阻塞,直到队列有空闲位置后才插入数据,然后返回.

2.并非队列:

线程安全的队列就是并发队列.

3.有界队列(bounded queue)

基于数组实现的队列,队列的大小有限

4.无界队列(unbounded queue)

基于链表实现的队列,队列的大小无限

ConcurrentLinkedQueue

一个基于链表节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。
队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。
新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。
当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。

1.添加

offer(E e)和add(E e):

 将指定元素插入此队列的尾部。

//add底层也是调用offer方法 
public boolean add(E e) {
        return offer(e);
    }

2.获取和移除

poll() 
         获取并移除此队列的头,返回被异常的元素,如果此队列为空,则返回 null。

peek() 
          获取但不移除此队列的头;如果此队列为空,则返回 null

remove(Object o) 
          从队列中移除指定元素的单个实例(如果存在),remove一个已存在元素,会返回true,remove不存在元素,返回false

3.判断队列是否为空

需要判断队列是否为空时,尽量不要用 queue.size()>0,而是用 !queue.isEmpty()

4.队列是否包含指定元素

contains(Object o) 
          如果此队列包含指定元素,则返回 true

5.队列的迭代

iterator() 
          返回在此队列元素上以恰当顺序进行迭代的迭代器

@Test
	public void test() {
		ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
		//1.队尾添加元素
		queue.offer("1");
		queue.add("2");
		queue.add("3");
		System.out.println("offer后,队列是否空?--->>" + queue.isEmpty());
		//2.队头移除元素
		System.out.println("从队列中poll:--->>" + queue.poll());
		//获取队头元素,但不移除
		System.out.println("从队列中peek:--->>" + queue.peek());
		System.out.println("从队列中peek:--->>" + queue.peek());
		//移除指定元素
		System.out.println("从队列中remove已存在元素:" + queue.remove("2"));
		System.out.println("从队列中remove不存在元素 :" + queue.remove("哈哈哈"));
		//4.队列是否包含指定元素
		System.out.println(queue.contains("3"));
		System.out.println(queue.contains("123"));
		//5.队列的迭代
		Iterator<String> iterator = queue.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
		
	}

结果:

offer后,队列是否空?--->>false
从队列中poll:--->>1
从队列中peek:--->>2
从队列中peek:--->>2
从队列中remove已存在元素:true
从队列中remove不存在元素 :false
true
false
3

 

原理:http://ifeve.com/concurrentlinkedqueue/

api使用:https://www.cnblogs.com/yangzhenlong/p/8359875.html 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值