Java集合中的ArrayDeque
ArrayDeque介绍
ArrayDeque 类的使用详解. ArrayDeque
是 Deque
接口的一个实现,使用了可变数组,所以没有容量上的限制。同时,ArrayDeque
是线程不安全的,在没有外部同步的情况下,不能再多线程环境下使用。ArrayDeque
是 Deque
的实现类,可以作为栈来使用,效率高于 Stack
;也可以作为队列来使用,效率高于 LinkedList
。需要注意的是,ArrayDeque 不支持 null 值。
常用的方法
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() 克隆(复制)一个新的队列
注意点
- 结构:在
ArrayDeque
底层使用了数组来存储数据,同时用两个int
值head
和tail
来表示头部和尾部。不过需要注意的是tail
并不是尾部元素的索引,而是尾部元素的下一位,即下一个将要被加入的元素的索引。 - 数组长度大小计算: 得到下一个
≥
输入长度的2的幂次方的值。
private void allocateElements(int numElements) {
int initialCapacity = MIN_INITIAL_CAPACITY;
// 找到大于需要长度的最小的2的幂整数。
// Tests "<=" because arrays aren't kept full.
if (numElements >= initialCapacity) {
initialCapacity = numElements;
initialCapacity |= (initialCapacity >>> 1);
initialCapacity |= (initialCapacity >>> 2);
initialCapacity |= (initialCapacity >>> 4);
initialCapacity |= (initialCapacity >>> 8);
initialCapacity |= (initialCapacity >>> 16);
initialCapacity++;
if (initialCapacity < 0) // Too many elements, must back off
initialCapacity >>>= 1;// Good luck allocating 2 ^ 30 elements
}
elements = (E[]) new Object[initialCapacity];
}
- 扩容:大小变为原来的两倍。
使用
// 作为堆栈使用
ArrayDeque<String> stack = new ArrayDeque<>();
stack.push("hello");
stack.push(" ");
stack.push("world!");
System.out.println(stack.pop());
System.out.println(stack.size());
System.out.println(stack.getFirst());
// 作为队列使用
ArrayDeque<String> queue = new ArrayDeque<>();
queue.offer("hello");
queue.offerLast("world");
System.out.println(queue.poll());
System.out.println(queue.size());
跟 LinkedList
的集合使用起来差不多,但是性能应该会好一些。