一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
Queue允许从队列的尾部进行入队操作,从队列的头部进行出队操作,而Deque允许从一端即进行入队操作,又进行出队操作;Queue和Deque都不允许在除了队列头部或者队列尾部的其他索引位上进行数据操作。
ArrayDeque剖析概述
ArrayDeque底层数据结构是一个循环数组,如下图所示:
ArrayDeque中有三个关键属性:
transient Object[] elements; // non-private to simplify nested class access
transient int head;
transient int tail;
elements可以理解为该循环数组;head表示有效数据范围的头部,即可以进行移除操作数据对象的索引位;tail表示有效数据范围的尾部,即可以进行添加操作的数据对象的索引位;head属性和tail属性所标识的有效数据范围在不停的变化,有时候tail属性记录的索引位会小于head属性记录的索引位;
ArrayDeque的常用方法
ArrayDeque既可以按照队列结构进行使用,也可以按照双端队列来使用,还可以按照栈来使用,其不同结构对应的方法也是不同的;
- 作为队列结构使用
| 方法 | 说明 |
|---|---|
| add(e) | 在队列尾部添加元素,注意不能为null |
| offer(e) | 方法同add(e) |
| remove() | 从队列头部移除对象,如果队列集合中没有元素,会抛出NoSuchElementException |
| poll() | 从队列头部移除对象,如果队列集合中没有元素,不会抛出异常,只会返回null |
| element() | 试图从队列头部移除对象,但不会真正移除,如果队列集合中没有元素,会抛出NoSuchElementException |
| peek() | 试图从队列头部移除对象,但不会真正移除,如果队列集合中没有元素,不会抛出异常,只会返回null |
- 作为双端队列结构使用
| 方法 | 说明 |
|---|---|
| addLast(e) | 在双端队列尾部添加对象,注意插入的对象不能为null,否则抛出NullPointerException |
| addFirst(e) | 在双端队列头部添加对象,注意插入的对象不能为null,否则抛出NullPointerException |
| offerLast(e) | 同addLast(e),返回true |
| offerFirst(e) | 同addFirst(e),返回true |
| removeLast() | 从双端队列的尾部移除对象,如果队列集合中没有元素,会抛出NoSuchElementException |
| removeFirst() | 从双端队列的头部移除对象,如果队列集合中没有元素,会抛出NoSuchElementException |
| pollLast() | 从双端队列的尾部移除对象,如果队列集合中没有元素,会返回null |
| pollFirst() | 从双端队列的头部移除对象,如果队列集合中没有元素,会返回null |
| getFirst() | 从双端队列的头部获取对象,如果队列集合中没有元素,会抛出NullPointerException |
| getLast() | 从双端队列的尾部获取对象,如果队列集合中没有元素,会抛出NullPointerException |
| peekFirst() | 从双端队列的头部获取对象,如果队列集合中没有元素,会返回null |
| peekLast() | 从双端队列的头部获取对象,如果队列集合中没有元素,会返回null |
- 按照栈结构来使用
| 方法 | 说明 |
|---|---|
| push(e) | 在栈结构头部添加新的数据对象,该对象不能为null |
| pop() | 从栈的头部移除数据对象,如果队列集合中没有元素,会抛出NoSuchElementException |