Deque

Deque是双端队列,可以使用FIFO(队列)和FILO(栈),其实现常见的有ArrayDeque,LinkedList、LinkedBlockingDeque(线程安全)

一. ArrayDeque是基于数组实现的,且数组容量是可扩展的(即无容量边界)的双端队列。它不是线程安全的。该类性能可能快于stack,在作为队列时快于LinkedList。

ArrayDeque作为stack的取代类,而使用。

多数情况下,需要对ArrrayDeque作为线性访问来使用。ArrayDeque内部通过对数组结构使用了存取技巧:双向操作数组。在开始,数组的最后索引位置为head标,起始索引为

tail标,从外观上看,类似一个队列。addFirst将触发head游标-1,addLast将触发tail游标+1,直到head == tail时宣布数组尺寸重新分配。当然removeFirst是将head值置为null,

然后head游标+1。removeLast同样。。由此可见,ArrayDeque(包括所有类型的queue)是不能加入null的。

重新设置size时,是将数组的尺寸直接扩充为原来的两倍,此时head=tail,使用数组copy吧0~tail和head~(length -1)的两段数组分别copy到新数组中,

即新数组和原数组的却别就是中间有已被尺寸的空位。

操作示意图0----tail--->|<-----head----end.

二. LinkedList也是非线程安全的,直接原因就是它和AarrayDeque一样在java.util包中,而不是concurrent包中。LinkedList是非常常用的实现stack和queue的API。

三. ArrayBlockingQueue和LinkedBlockingQueue,这2个API是线程安全的,支持阻塞行为的。

ArrayBlockingQueue是一个有界队列API,需要指定队列的尺寸,其内部实现是基于数组,操作技巧:循环数组。数组的操作上,有2个属性putIndex和takeIndex,putIndex是

下一次put时的位置,takeIndex是下一次take操作时的位置,putIndex和takeIndex区间内的数据时可访问的,如果putIndex = takeIndex,说明数组已经“满”或者“空了”。

0---takeIndex-->---<--putIndex---End.

LinkedBlockingQueue是基于链表实现,支持无界队列,同时也可以支持有界队列(需要传递容量参数)。

 

你可能感兴趣的:(deque)