赞
踩
deque(double-ended queue,双端队列)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出
Deque表示双端队列。双端队列是在两端都可以进行插入和删除的队列。
1. LinkedList
新建一个双端队列:Deque deque = new LinkedList();
2.ArrayDeque
新建一个双端队列:Deque deque = new ArrayDeque();
二者的区别:
ArrayDeque 比 LinkedList 更优秀
因为 ArrayDeque 在插入、删除和访问元素时都具有常数时间的时间复杂度 O(1), ArrayDeque 内部实现了一个循环数组,可以在队列的两端高效地插入和删除元素。队列的两端都有空余空间时,插入和删除操作只需要修改数组的指针,时间复杂度是 O(1);当队列的两端空间不足时,需要进行扩容操作,但由于 ArrayDeque 内部实现了循环数组,扩容操作只需要把原来的数组复制到新的更大的数组中即可,时间复杂度也是 O(1)。ArrayDeque 不安全
而 LinkedList 在访问元素时的时间复杂度是 O(n),插入和删除元素的时间复杂度是 O(1),安全的
如果一直是插入,没有查询,则LinkedList更适合,因为不需要扩容 ,如果涉及到查询就选择ArrayDeque
安全集合类:
3. ConcurrentLinkedDeque
Deque deque = new ConcurrentLinkedDeque<>(); 基于链表实现的双端并发队列,支持高效的插入、删除和访问操作,并且可以在多线程环境下安全地使用。
4.LinkedBlockingDeque
Deque deque= new LinkedBlockingDeque<>(); 基于链表实现的阻塞队列(不是双端队列,单端队列,只是为了实现deque接口,内部做了些转化),支持高效的插入、删除和访问操作,并且在队列为空或满时可以阻塞等待。(LinkedBlockingDeque 内部使用了锁和条件变量来实现线程同步和阻塞等待,以保证线程安全)
区别:1.线程安全性:ConcurrentLinkedDeque 是线程安全的,支持多线程并发操作,
而 LinkedBlockingDeque 也是线程安全的,但是它的实现方式是阻塞式的,即当队列为空或满时,操作会被阻塞,等待条件满足后再执行(LinkedBlockingDeque 支持阻塞操作,当队列为空时,从队头获取元素或者向队尾插入元素的操作会被阻塞,直到队列中有元素可用;当队列满时,向队尾插入元素的操作也会被阻塞,直到队列中有空闲空间。)因此它的性能可能会受到影响。
2.ConcurrentLinkedDeque 的实现方式是基于无锁算法实现的,因此在多线程环境下具有较好的性能和可扩展性。而 LinkedBlockingDeque 的实现方式是基于锁实现的,并且需要使用两个锁来实现阻塞操作和线程安全,因此在高并发环境下可能会出现性能瓶颈
5.PriorityDeque:
基于堆实现的优先级队列,支持按照元素的优先级进行插入和删除操作。 除了此类,其他都支持双端操作,因为都以上几种都实现了deque的双端操作方法
:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。