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():获取队首的元素(不删除该元素!)
package day0607;
import java.util.LinkedList;
import java.util.Queue;
/**
* @author Limi
* Queue 队列 先进先出
*/
public class Demo04 {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<Integer>();
for(int i=0;i<=10;i++){
queue.offer(i);
}
System.out.println(queue);
/*
* peek():获取队首的元素(不删除该元素!)
*/
System.out.println("peek():"+queue.peek());
/*
* poll():从队列中取出元素,取得的是最早的 offer 元素,从队列中取出元素后,
* 该元素会从队列中删除。若方法返回 null 说明 队列中没有元素了。
*/
Integer integer = null;
while((integer=queue.poll()) != null){
System.out.print(integer);
}
System.out.println("\npeek():"+queue.peek());
}
}
栈 (Deque)
是常用的数据结构, 是 Queue 队列的子接口, 因此 LinkedList 也实现了 Deque接口。栈将双端队列限制为只能从一端入队和出队,对栈而言即是入栈和出栈。子弹夹就是一种栈结构。在包 java.util.Deque 下。
1)栈遵循先进后出的原则:FILO(First Input Last Output)。
2)常用方法:
①push:压入,向栈中存入数据。
②pop:弹出,从栈中取出数据。
③peek:获取栈顶位置的元素,但不取出。
注意: 我们在使用 pop 获取栈顶元素之前, 应现使用 peek 方法获取该元素,确定该元素不为 null 的情况下才应该将该元素从栈中弹出”,否则若栈中没有元素后,我们调用 pop 会抛出异常“NoSuchElementException” 。
package day0607;
import java.util.Deque;
import java.util.LinkedList;
/**
* @author Limi
* 栈 (Deque) 双端队列 先进后出
*/
public class Demo05 {
public static void main(String[] args) {
Deque<String> deque = new LinkedList<String>();
for(int i=1;i<6;i++){
deque.push(i+"");//压入,向栈中存入数据。
}
System.out.println(deque);
/*
* peek:获取栈顶位置的元素,但不取出。
* 注意事项: 我们在使用 pop 获取栈顶元素之前, 应现使用 peek 方法获取该元素,
* 确定该元素不为 null 的情况下才应该将该元素从栈中弹出” , 否则若栈中没有元
* 素后,我们调用 pop 会抛出异常“NoSuchElementException” 。
*/
while(deque.peek()!=null){
//pop:弹出,从栈中取出数据。
System.out.print(deque.pop());
}
System.out.println("\n"+deque);
}
}
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。
这篇博客探讨了Java中的Queue和Deque数据结构。Queue是遵循先进先出(FIFO)原则的接口,常用方法包括offer、poll和peek。LinkedList实现了Queue接口。Deque是Queue的子接口,适用于栈操作,遵循先进后出(FILO)原则,提供了push、pop和peek方法。ArrayDeque是基于数组的双端队列,可以作为栈和队列使用,但不是线程安全的,性能优于Stack和LinkedList。

被折叠的 条评论
为什么被折叠?



