一、Deque简介
Java Deque(双端队列)接口是Java集合框架中的一部分,用于在队列的两端插入和删除元素。它是一个线性集合,支持元素的插入、删除和检查操作,可以用作栈和队列的混合体。
Deque接口有两个实现类:LinkedList和ArrayDeque。LinkedList底层是由双向链表实现的,而ArrayDeque底层则是用数组实现的。两者都实现了Deque接口,但是在某些情况下,这些实现可能会产生性能差异。
二、Deque的使用方法
Deque接口有丰富的API,可以满足不同的需求。下面对Deque的使用方法进行介绍。
1. 添加元素
向Deque中添加元素可以用addFirst()、addLast()、offerFirst()和offerLast()四个方法。
Deque<String> deque = new LinkedList<>();
deque.addFirst("first"); //在队列头部添加元素
deque.addLast("last"); //在队列尾部添加元素
deque.offerFirst("offer first"); //在队列头部添加元素
deque.offerLast("offer last"); //在队列尾部添加元素
2. 获取元素
从Deque中获取元素可以使用getFirst()、getLast()、peekFirst()和peekLast()四个方法。
Deque<String> deque = new LinkedList<>();
deque.add("first");
deque.add("second");
deque.add("third");
String first = deque.getFirst(); //获取队列头部的元素,如果队列为空,则返回NoSuchElementException异常。
String last = deque.getLast(); //获取队列尾部的元素,如果队列为空,则返回NoSuchElementException异常。
String peekFirst = deque.peekFirst(); //获取队列头部的元素,如果队列为空,则返回null。
String peekLast = deque.peekLast(); //获取队列尾部的元素,如果队列为空,则返回null。
3. 删除元素
从Deque中删除元素可以使用removeFirst()、removeLast()、pollFirst()和pollLast()四个方法。
Deque<String> deque = new LinkedList<>();
deque.add("first");
deque.add("second");
deque.add("third");
String first = deque.removeFirst(); //删除并返回队列头部的元素,如果队列为空,则返回NoSuchElementException异常。
String last = deque.removeLast(); //删除并返回队列尾部的元素,如果队列为空,则返回NoSuchElementException异常。
String pollFirst = deque.pollFirst(); //删除并返回队列头部的元素,如果队列为空,则返回null。
String pollLast = deque.pollLast(); //删除并返回队列尾部的元素,如果队列为空,则返回null。
4. 检查元素
检查Deque中是否含有某个元素可以用contains()方法,获取Deque中元素的个数可以用size()方法。
Deque<String> deque = new LinkedList<>();
deque.add("first");
deque.add("second");
deque.add("third");
boolean contains = deque.contains("first"); //检查队列中是否含有"first"元素
int size = deque.size(); //获取队列中元素的个数
三、LinkedList与ArrayDeque的性能比较
由于LinkedList和ArrayDeque在底层的实现方式不同,所以它们的性能表现也有所差异。下面通过代码进行对比。
1. LinkedList性能测试
long startTime = System.currentTimeMillis();
Deque<Integer> deque = new LinkedList<>();
for (int i = 0; i < 1000000; i++) {
deque.addLast(i);
}
while (deque.size() > 0) {
deque.removeFirst();
}
long endTime = System.currentTimeMillis();
System.out.println("LinkedList time: " + (endTime - startTime) + "ms");
2. ArrayDeque性能测试
long startTime = System.currentTimeMillis();
Deque<Integer> deque = new ArrayDeque<>();
for (int i = 0; i < 10000000; i++) {
deque.addLast(i);
}
while (deque.size() > 0) {
deque.removeFirst();
}
long endTime = System.currentTimeMillis();
System.out.println("ArrayDeque time: " + (endTime - startTime) + "ms");
由于性能测试结果会受到环境和代码的影响,所以上面的代码只是为了演示LinkedList和ArrayDeque的性能差异,并不代表实际情况。
至此,我们已经了解了Java Deque接口的实现及使用方法,可以在实际开发中根据需要选择适合的实现类。