📜  Java中的ArrayDeque(1)

📅  最后修改于: 2023-12-03 15:31:56.774000             🧑  作者: Mango

Java中的ArrayDeque

Java中的ArrayDeque是一种双端队列,它可以在队列的两端进行插入和删除操作。ArrayDeque是线程不安全的,因此在多线程环境中应该使用ConcurrentLinkedDeque代替。

特点
  • ArrayDeque是基于数组实现的,因此可以随机访问元素,并且具有高效的添加和删除操作
  • 插入和删除操作可以分别在队列的头部或尾部进行,而不需要移动数组中的元素
  • ArrayDeque不支持存储null元素
实例化
Deque<String> deque = new ArrayDeque<>();
添加元素

可以使用add、offer、push方法将元素添加到队列的头部或尾部。

deque.add("A"); // 添加到队列尾部
deque.offer("B"); // 添加到队列尾部
deque.push("C"); // 添加到队列头部
访问元素

可以使用get方法随机访问元素,或使用peek和pop方法访问队列的头部或尾部。

String element = deque.get(0); // 访问第一个元素
String first = deque.peek(); // 访问队列头部元素
String last = deque.peekLast(); // 访问队列尾部元素
删除元素

可以使用remove、poll和pop方法删除元素,remove方法会抛出NoSuchElementException异常,而poll方法则会返回null。

deque.remove(); // 删除队列头部元素
deque.removeLast(); // 删除队列尾部元素
deque.poll(); // 删除队列头部元素
deque.pollLast(); // 删除队列尾部元素
deque.pop(); // 删除队列头部元素
遍历元素

可以使用for-each循环或迭代器遍历队列中的元素。

for(String str : deque) {
    System.out.println(str);
}

Iterator<String> iterator = deque.iterator();
while(iterator.hasNext()) {
    System.out.println(iterator.next());
}
性能测试

进行了ArrayDeque和LinkedList的性能比较,具体代码及测试结果如下。

Deque<Integer> arrayDeque = new ArrayDeque<>();
Deque<Integer> linkedList = new LinkedList<>();

long startTime = System.currentTimeMillis();
for(int i = 0; i < 100000; i++) {
    arrayDeque.add(i);
}
long endTime = System.currentTimeMillis();
System.out.println("ArrayDeque添加100000个元素耗时:" + (endTime - startTime) + "ms");

startTime = System.currentTimeMillis();
for(int i = 0; i < 100000; i++) {
    linkedList.add(i);
}
endTime = System.currentTimeMillis();
System.out.println("LinkedList添加100000个元素耗时:" + (endTime - startTime) + "ms");

startTime = System.currentTimeMillis();
for(int i = 0; i < 100000; i++) {
    arrayDeque.remove();
}
endTime = System.currentTimeMillis();
System.out.println("ArrayDeque删除100000个元素耗时:" + (endTime - startTime) + "ms");

startTime = System.currentTimeMillis();
for(int i = 0; i < 100000; i++) {
    linkedList.remove();
}
endTime = System.currentTimeMillis();
System.out.println("LinkedList删除100000个元素耗时:" + (endTime - startTime) + "ms");

结果表明,ArrayDeque在添加和删除元素时比LinkedList的效率更高。

ArrayDeque添加100000个元素耗时:3ms
LinkedList添加100000个元素耗时:7ms
ArrayDeque删除100000个元素耗时:1ms
LinkedList删除100000个元素耗时:23ms