容器(四) ArrayDeque源码解析
概述:在使用到队列或者数组的场景下,LinkedList可以满足条件,但是效率一般,所以ArrayDeque得以诞生。
定义:ArrayDeque底层是Object[]存储数据,通过双向链表形成顺序关系,对头部和尾部都有相同的处理方式。
- 方法
First Element - Head | Last Element - Tail | |||
---|---|---|---|---|
Throws exception | Special value | Throws exception | Special value | |
Insert | addFirst(e) | offerFirst(e) | addLast(e) | offerLast(e) |
Remove | removeFirst() | pollFirst() | removeLast() | pollLast() |
Examine | getFirst() | peekFirst() | getLast() | peekLast() |
-
作为Queue的场景
队列特点是FIFO先进先出,所以新增时插入队列尾部,取出时/删除 时从队列头部取出
方法场景:
新增:addLast/offerLast
删除:removeFirst/pollFirst
查询:getFirst/peekFirst -
作为Stack场景,特点是先进后出
方法场景:
新增:addFirst/offerFirst
删除:removeFirst/pollFirst
查询:getFirst/peekFirst
使用注意点:
add中的扩容
会对现有容量扩容一倍,复制分两次进行,第一次复制head右边的元素,第二次复制head左边的元素
addLast(E e)的作用是在Deque的尾端插入元素,也就是在tail的位置插入元素,由于tail总是指向下一个可以插入的空位,因此只需要elements[tail] = e;即可。插入完成后再检查空间,如果空间已经用光,则调用doubleCapacity()进行扩容。
pollFirst()的作用是删除并返回Deque首端元素,也即是head位置处的元素。如果容器不空,只需要直接返回elements[head]即可,当然还需要处理下标的问题。由于ArrayDeque中不允许放入null,当elements[head] == null时,意味着容器为空。
pollLast()的作用是删除并返回Deque尾端元素,也即是tail位置前面的那个元素。
peekFirst()的作用是返回但不删除Deque首端元素,也即是head位置处的元素,直接返回elements[head]即可。
peekLast()的作用是返回但不删除Deque尾端元素,也即是tail位置前面的那个元素。