ArrayDeque
的结构是一个循环数组,用做栈比Stack
性能优秀,用做队列比LinkedList
要好算法
成员变量数组
由于是循环数组,因此自己就是一个数组elements
来存储元素,而且有数组的容量;而循环意味着在插入删除元素的时候一定有两个方向,因此会有head
和tail
,相似于双指针。函数
构造函数性能
分析allocateElements
,原理上和HashMap
中的计算容量的算法是差很少的spa
以上函数是为了找到大于等于须要长度的最小2的幂整数。指针
offer
code
add
队列
push
ci
能够看到全部关于新增的操做都是调用了add
相关函数,源码的解释也如上图所示。element
remove
pop
poll
contains
peek
扩容发生的时机在增长中有体现,当head == tail
的时候就会调用doubleCapacity
进行扩容
为何不直接用一次System.arraycopy
来完成数组的迁移呢
若是直接一次性所有迁移就会面临一个问题,head和tail分别指向哪里呢。
基于上述两方面的考虑,最终的迁移如图所示。
element.length - 1
下标往小下标增长。创做不易,欢迎点赞,收藏和分享啦!下面是我的公众号,有兴趣的能够关注一下,基本2,3天1更技术文章!!!