首页 > 编程语言 >32 | JAVA集合Deque(一种接口,比Queue更丰富的接口,底层实现可为LinkedList)

32 | JAVA集合Deque(一种接口,比Queue更丰富的接口,底层实现可为LinkedList)

时间:2022-09-02 09:01:48浏览次数:81  
标签:Deque JAVA LinkedList 接口 Queue offerLast 取队

Deque

如果把条件放松一下,允许两头都进,两头都出,这种队列叫双端队列(Double Ended Queue),学名Deque

Java集合提供了接口Deque来实现一个双端队列,它的功能是:

  • 既可以添加到队尾,也可以添加到队首;
  • 既可以从队首获取,又可以从队尾获取。

我们来比较一下QueueDeque出队和入队的方法:

Queue Deque
添加元素到队尾 add(E e) / offer(E e) addLast(E e) / offerLast(E e)
取队首元素并删除 E remove() / E poll() E removeFirst() / E pollFirst()
取队首元素但不删除 E element() / E peek() E getFirst() / E peekFirst()
添加元素到队首 addFirst(E e) / offerFirst(E e)
取队尾元素并删除 E removeLast() / E pollLast()
取队尾元素但不删除 E getLast() / E peekLast()

注意到Deque接口实际上扩展自Queue

public interface Deque<E> extends Queue<E> {
    ...
}

因此,Queue提供的add()/offer()方法在Deque中也可以使用,但是,使用Deque,最好不要调用offer(),而是调用offerLast()

联想:按照 C++ 思维,那么 Quene 应该作为适配器来封装 Deque,但是,按照 JAVA 的思维,接口和实现分开,那么 Deque 是较 Quene 更为丰富的接口。

import java.util.Deque;
import java.util.LinkedList;
public class Main {
    public static void main(String[] args) {
        Deque<String> deque = new LinkedList<>();
        deque.offerLast("A"); // A
        deque.offerLast("B"); // A <- B
        deque.offerFirst("C"); // C <- A <- B
        System.out.println(deque.pollFirst()); // C, 剩下A <- B
        System.out.println(deque.pollLast()); // B, 剩下A
        System.out.println(deque.pollFirst()); // A
        System.out.println(deque.pollFirst()); // null
    }
}

使用Deque,推荐总是明确调用offerLast()/offerFirst()或者pollFirst()/pollLast()方法。

Deque是一个接口,它的实现类有ArrayDequeLinkedList

我们发现LinkedList真是一个全能选手,它即是List,又是Queue,还是Deque。但是我们在使用的时候,总是用特定的接口来引用它,这是因为持有接口说明代码的抽象层次更高,而且接口本身定义的方法代表了特定的用途。

// 不推荐的写法:
LinkedList<String> d1 = new LinkedList<>();
d1.offerLast("z");
// 推荐的写法:
Deque<String> d2 = new LinkedList<>();
d2.offerLast("z");

可见面向抽象编程的一个原则就是:尽量持有接口,而不是具体的实现类。

联想:C++ 中是有具体类不用管底层实现,当然你可以自己通过类模板参数来指定底层容器。而JAVA需要你明确接口并且给接口找到一个具体实现。

标签:Deque,JAVA,LinkedList,接口,Queue,offerLast,取队
From: https://www.cnblogs.com/mmxingye/p/16648562.html

相关文章

  • 33 | JAVA集合Stack(一种接口,不推荐使用)
    Stack栈(Stack)是一种后进先出(LIFO:LastInFirstOut)的数据结构。Stack只有入栈和出栈的操作:把元素压栈:push(E);把栈顶的元素“弹出”:pop();取栈顶元素但不弹出:peek()。......
  • 27 | JAVA集合TreeMap(Map接口下除HashMap实现的另一种实现)
    TreeMap我们已经知道,HashMap是一种以空间换时间的映射表,它的实现原理决定了内部的Key是无序的,即遍历HashMap的Key时,其顺序是不可预测的(但每个Key都会遍历一次且仅遍历一次......
  • 28 | JAVA集合Properties专门用来存取配置文件(底层仍为哈希表)
    使用Properties配置文件的特点是,它的Key-Value一般都是String-String类型的,因此我们完全可以用Map<String,String>来表示它由于历史遗留原因,Properties内部本质上是一......
  • 29 | JAVA集合Set(一种接口,Map的同级映射)
    Set如果我们只需要存储不重复的key,并不需要存储映射的value,那么就可以使用Set。Set用于存储不重复的元素集合,它主要提供以下几个方法:将元素添加进Set<E>:booleanadd(E......
  • 30 | JAVA集合Queue(一种接口,实现为LinkedList)
    Queue队列(Queue)是一种经常使用的集合。Queue实际上是实现了一个先进先出(FIFO:FirstInFirstOut)的有序表。它和List的区别在于,List可以在任意位置添加和删除元素,而Queue只......
  • 21 | JAVA注解
    注解什么是注解(Annotation)?注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释”:Java的注解可以分为三类:第一类是由编译器使用的注解,例如:@Override:让编译器检......
  • 22 | JAVA泛型基础
    初步认识ArrayList<>ArrayListArrayList一种模板:ArrayList<T>,代码如下:publicclassArrayList<T>{privateT[]array;privateintsize;publicvoida......
  • 23 | JAVA集合简介(C++容器)
    集合简介C++中将容器分成三类:顺序、关联、hash。容器在JAVA中映射为集合。等号左边(接口)等号右边(实现)ListArrayList/LinkedListSetHashSet/TreeSet......
  • 24 | JAVA集合之List(实际为接口)
    使用List在集合类中,List是最基础的一种集合:它是一种有序列表。List下的两种具体实现ArrayList和LinkedList,本别对应数组和链表。List的接口List<E>接口在末......
  • 25 | JAVA集合Map(实际为接口)
    使用MapMap这种键值(key-value)映射表的数据结构,作用就是能高效通过key快速查找value(元素)。Map也是一个接口,最常用的实现类是HashMap。containsKey(Kkey)方法put()ge......