Deque(双向队列)的使用

504 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。
  大家都知道,在java中,可以用stack来实现栈结构。但是由于stack的底层实现,为了线程安全而使用了大量的synchronized修饰符,导致使用起来效率比较低。现在比较推荐的是用deque(double ended queue)来实现栈(以及队列)结构。

  deque的常见初始化方式有两种:
  1.Deque<Integer> queue=new ArrayDeque<>();//一般用于队列
  2.Deque<Integer> stack=new LinkedList<>();//一般用于栈

  ArrayDeque底层由数组实现,LinkedList底层由链表实现,所以它们各自适合的使用情况相信大家都很清楚了,在此不做赘述。

Deque中的主要方法:

队列方法作用
add向队尾插入元素,失败则抛出异常
offer向队尾插入元素,失败则返回false
remove移除队首元素,失败则抛出异常
poll移除队首元素,失败则返回null
peek获取队首元素但不移除,失败则返回null

栈方法作用
push向栈顶插入元素,失败则抛出异常
pop弹出栈定元素,失败则抛出异常
peek查看栈顶元素但不移除,失败抛出异常

# 总结:
  deque做队列时,常用方法为offer/poll/peek。做栈时,常用方法为push/pop/peek;
  可能有小伙伴会产生疑问,deque怎么区分peek方法应该弹出的是队首还是栈顶元素呢,它怎么知道我现在实现的是队列还是堆栈结构?
  其实不管是队列还是堆栈结构,peek的作用都是一样的,就是类似于返回数组中下标为0的那个元素。理由是当我们用offer方法向队列中压入'c','y','h'以后,队列存储结构就是'c','y','h'的顺序,peek会查看到元素'c'。但是当我们用push方法向栈中依次压入'c','y','h'以后,栈的存储结构是'h','y',c',那么peek方法当然也会查看到“下标为0的元素”,也就是'h'啦。

  由于本人水平有限,文章中可能会出现不准确甚至错误之处,欢迎大家及时评论指出。