Java集合框架系列——ArrayDeque
程序员文章站
2024-02-11 19:31:34
...
直通车:Java集合框架系列目录
本篇博文分为五个部分:
- 基本概念
- 继承关系
- 结构特点
- 常用API
- 代码示例
1.基本概念
ArrayDeque:一种用循环数组实现的双端队列。
2.继承关系
ArrayDeque是一个继承于Deque的双端队列。
ArrayDeque实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
ArrayDeque实现java.io.Serializable接口,意即ArrayList支持序列化,能通过序列化传输。
public class ArrayDeque<E> extends AbstractCollection<E>
implements Deque<E>, Cloneable, Serializable
3.结构特点
底层机制基于循环数组实现
ArrayDeque数组中的任何一点都可能被看作起点(head)或终点(tail)。
每次执行add等方法时不移动数组元素,只移动head与tail指针。
数组的大小一定是2^n。(在容量保证为 2^n 的情况下,仅仅通过位与操作就可以完成环形索引的计算,而不需要进行边界的判断,在实现上更为高效。)
每次扩容都是在原来基础上x2。不可以存取null元素
系统会根据某个位置是否为null来判断元素的存在。当作为栈使用时,性能比Stack好;当作为队列使用时,性能比LinkedList好
不是线程安全的
在并发访问时,如果在迭代同时有其他线程修改了 ArrayDeque, fail-fast 的迭代器 Iterator/ListIterator 会抛出ConcurrentModificationException异常。
4.常用API
1.添加元素
addFirst(E e)在数组前面添加元素
addLast(E e)在数组后面添加元素
offerFirst(E e) 在数组前面添加元素,并返回是否添加成功
offerLast(E e) 在数组后天添加元素,并返回是否添加成功
2.删除元素
removeFirst()删除第一个元素,并返回删除元素的值,如果元素为null,将抛出异常
pollFirst()删除第一个元素,并返回删除元素的值,如果元素为null,将返回null
removeLast()删除最后一个元素,并返回删除元素的值,如果为null,将抛出异常
pollLast()删除最后一个元素,并返回删除元素的值,如果为null,将返回null
removeFirstOccurrence(Object o) 删除第一次出现的指定元素
removeLastOccurrence(Object o) 删除最后一次出现的指定元素
3.获取元素
getFirst() 获取第一个元素,如果没有将抛出异常
getLast() 获取最后一个元素,如果没有将抛出异常
4.队列操作
add(E e) 在队列尾部添加一个元素
offer(E e) 在队列尾部添加一个元素,并返回是否成功
remove() 删除队列中第一个元素,并返回该元素的值,如果元素为null,将抛出异常(其实底层调用的是removeFirst())
poll() 删除队列中第一个元素,并返回该元素的值,如果元素为null,将返回null(其实调用的是pollFirst())
element() 获取第一个元素,如果没有将抛出异常
peek() 获取第一个元素,如果返回null
5.栈操作
push(E e) 栈顶添加一个元素
pop(E e) 移除栈顶元素,如果栈顶没有元素将抛出异常
6.其他
size() 获取队列中元素个数
isEmpty() 判断队列是否为空
iterator() 迭代器,从前向后迭代
descendingIterator() 迭代器,从后向前迭代
contain(Object o) 判断队列中是否存在该元素
toArray() 转成数组
clear() 清空队列
clone() 克隆(复制)一个新的队列
5.代码示例
public static void main(String[] args) {
ArrayDeque<Integer> arrayDeque = new ArrayDeque<>();
arrayDeque.addFirst(2);
arrayDeque.add(3);
arrayDeque.addFirst(4);
Integer[] a = new Integer[arrayDeque.size()];
for(int i:arrayDeque.toArray(a)){
System.out.println(i);
}
}
输出结果为:
4
2
3
如有谬误或不完善之处,恳请斧正!
上一篇: SQL递归查询
下一篇: mysql千万级数据大表该如何优化?