一、ArrayDeque 类介绍
我们知道在Java中创建接口对象是不可能的。因此,对于实例化,我们需要一个实现Deque接口的类,这个类就是ArrayDeque。它会随着每次使用而增长和收缩。它还继承了AbstractCollection类。
关于ArrayDeque类的特性是:
- 与Queue不同的是,我们可以在两边添加或删除元素。
- Null元素不允许出现在ArrayDeque中
- 它们不是线程安全的,这意味着在没有外部同步的情况下,ArrayDeque不支持多线程并发访问。
- ArrayDeque没有容量限制。
- ArrayDeque比LinkedList和Stack更快。
ArrayDeque层次结构
ArrayDeque同时实现了Queue和Deque。它可以从两边动态地调整大小。层次结构中ArrayDeque实现的所有接口为Serializable, Cloneable, Iterable, Collection, Deque, Queue
类描述:
public class ArrayDeque<E> extends AbstractCollection<E>
implements Deque<E>, Cloneable, Serializable
构造方法:
二、ArrayDeque 的操作
2.1 添加操作
为了向ArrayDeque中添加元素,我们可以使用add()、addFirst()、addLast()、offer()、offerFirst()、offerLast()方法。
- add()
- addFirst()
- addLast()
- offer()
- offerFirst()
- offerLast()
实例:
Deque<String> dq = new ArrayDeque<String>();
// 添加元素
dq.add("广州");
dq.addFirst("深圳");
dq.addLast("东莞");
System.out.println("添加后:ArrayDeque : " + dq);
// 添加元素——从后面添加
dq.offer("上海");
dq.offerFirst("北京");
dq.offerLast("杭州");
// 输出
System.out.println("ArrayDeque : " + dq);
输出
添加后:ArrayDeque : [深圳, 广州, 东莞]
ArrayDeque : [北京, 深圳, 广州, 东莞, 上海, 杭州]
2.2 访问操作
添加元素之后,如果我们希望访问元素,可以使用内置方法,如getFirst()、getLast()等。
- getFirst()
- getLast()
- peek()
- peekFirst()
- peekLast()
实例:
Deque<String> de_que = new ArrayDeque<String>();
// 添加元素
de_que.add("深圳");
de_que.add("广州");
de_que.add("佛山");
de_que.add("东莞");
de_que.add("珠海");
// 输出远古三
System.out.println("添加后ArrayDeque: " + de_que);
// 输出头部元素
System.out.println("头部元素: "
+ de_que.getFirst());
// 输出尾部元素
System.out.println("尾部元素: "
+ de_que.getLast());
输出
添加后ArrayDeque: [深圳, 广州, 佛山, 东莞, 珠海]
头部元素: 深圳
尾部元素: 珠海
2.3 删除操作
要从deque容器中删除一个元素,可以使用多种方法,因为我们也可以从两端进行删除,所以deque接口为我们提供了removeFirst()和removeLast()
方法。除此之外,该接口还为我们提供了poll()、pop()、pollFirst()、pollLast()方法
,其中pop()
用于删除和返回deque容器的头部,但是,使用poll()是因为它提供了与pop()相同的功能,并且当deque为空时不会返回异常。这些操作如下所示:
- remove()
- removeFirst()
- removeLast()
- poll()
- pollFirst()
- pollLast()
- pop()
Deque<String> de_que = new ArrayDeque<String>();
// 添加元素
de_que.add("深圳");
de_que.add("广州");
de_que.add("佛山");
de_que.add("东莞");
de_que.add("珠海");
// 输出
System.out.println("添加后ArrayDeque: " + de_que);
// 删除元素,出栈
System.out.println(de_que.pop());
// 删除元素,出列
System.out.println(de_que.poll());
// 删除:首元素,出列
System.out.println(de_que.pollFirst());
// 删除:尾元素,出列
System.out.println(de_que.pollLast());
输出:
添加后ArrayDeque: [深圳, 广州, 佛山, 东莞, 珠海]
深圳
广州
佛山
珠海
2.4 迭代操作
由于deque容器可以从两个方向进行迭代,因此deque接口的iterator方法为我们提供了两种迭代方法。一个从前面,另一个从后面。这些操作列示如下:
- remove()
- iterator()
- descendingIterator()
实例:
Deque<String> de_que = new ArrayDeque<String>();
// 添加元素
de_que.add("深圳");
de_que.add("广州");
de_que.add("佛山");
de_que.add("东莞");
de_que.add("珠海");
// 输出
System.out.println("添加后ArrayDeque: " + de_que);
// 迭代器:Iterator
for (Iterator itr = de_que.iterator(); itr.hasNext();) {
// 输出
System.out.print(itr.next() + " ");
}
// 下一行
System.out.println();
// 迭代器:反转元素,逆序输出
for (Iterator itr = de_que.descendingIterator();
itr.hasNext();) {
System.out.print(itr.next() + " ");
}
输出:
添加后ArrayDeque: [深圳, 广州, 佛山, 东莞, 珠海]
深圳 广州 佛山 东莞 珠海
珠海 东莞 佛山 广州 深圳