Java Deque

Deque是java.util下的接口,实现类:ArrayDeque, ConcurrentLinkedDeque, LinkedBlockingDeque, LinkedList ,是支持在两个端插入和去除元素的线性集合。
Deque接口继承了Queue的接口规范。LinkedList、ArrayDeque都是实现Deque接口。

   Queue<-----Duque<-----LinkedList、ArrayDeque

队列(Queue)

  是常用的数据结构,可以将队列看成特殊的线性表,队列限制了对线性表的访问方式:只能从线性表的一端添加(offer)元素,从另一端取出(poll)元素。Queue接口:在包 java.util.Queue。

1)队列遵循先进先出原则:FIFO(First Input First Output)队列不支持插队,插队是不道德的。
2)JDK 中提供了 Queue 接口,同时使得 LinkedList 实现了该接口(选择 LinkedList 实现Queue 的原因在于 Queue 经常要进行插入和删除的操作,而 LinkedList 在这方面效率较高) 。

常用方法:
①boolean offer(E e):将一个对象添加至队尾,如果添加成功则返回 true。
②poll():从队列中取出元素,取得的是最早的 offer 元素,从队列中取出元素后,该元素会从队列中删除。若方法返回 null 说明 队列中没有元素了。
③peek():获取队首的元素(不删除该元素!)

栈 (Deque)

   是常用的数据结构, 是 Queue 队列的子接口, 因此 LinkedList 也实现了 Deque接口。栈将双端队列限制为只能从一端入队和出队,对栈而言即是入栈和出栈。子弹夹就是一种栈结构。在包 java.util.Deque 下。

1)栈遵循先进后出的原则:FILO(First Input Last Output)。
2)常用方法:
①push:压入,向栈中存入数据。
②pop:弹出,从栈中取出数据。
③peek:获取栈顶位置的元素,但不取出。

注意: 我们在使用 pop 获取栈顶元素之前, 应现使用 peek 方法获取该元素,确定该元素不为 null 的情况下才应该将该元素从栈中弹出”,否则若栈中没有元素后,我们调用 pop 会抛出异常“NoSuchElementException” 。

ArrayDeque集合是Deque接口的实现类,它是一个基于数组的双端队列,创建Deque时同样可以指定一个numElements参数,该参数用于指定Object[]数组的长度;如果不指定该参数,Deque底层数组长度为16。 ArrayDeque集合既可当队列使用,也可当栈使用。

1)ArrayDeque有两个类属性,head和tail,两个指针。

2)ArrayDeque通过一个数组作为载体,其中的数组元素在add等方法执行时不移动,发生变化的只是head和tail指针,而且指针是循环变化,数组容量不限制。

3)offer方法和add方法都是通过其中的addLast方法实现,每添加一个元素,就把元素加到数组的尾部,此时,head指针没有变化,而tail指针加一,因为指针是循环加的,所以当tail追上head((this.tail = this.tail + 1 & this.elements.length - 1) == this.head)时,数组容量翻一倍,继续执行。

4)remove方法和poll方法都是通过其中的pollFirst方法实现,每移除一个元素,该元素所在位置变成null,此时,tail指针没有变化,而head指针加一,当数组中没有数据时,返回null。

5)因为ArrayDeque不是线程安全的,所以,用作堆栈时快于 Stack,在用作队列时快于 LinkedList。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值