java队列转集合_Java集合 使用Queue
隊(duì)列(Queue)是一種經(jīng)常使用的集合。Queue實(shí)際上是實(shí)現(xiàn)了一個(gè)先進(jìn)先出(FIFO:First In First Out)的有序表。它和List的區(qū)別在于,List可以在任意位置添加和刪除元素,而Queue只有兩個(gè)操作:
把元素添加到隊(duì)列末尾;
從隊(duì)列頭部取出元素。
超市的收銀臺(tái)就是一個(gè)隊(duì)列:
在Java的標(biāo)準(zhǔn)庫中,隊(duì)列接口Queue定義了以下幾個(gè)方法:
int size():獲取隊(duì)列長度;
boolean add(E)/boolean offer(E):添加元素到隊(duì)尾;
E remove()/E poll():獲取隊(duì)首元素并從隊(duì)列中刪除;
E element()/E peek():獲取隊(duì)首元素但并不從隊(duì)列中刪除。
對(duì)于具體的實(shí)現(xiàn)類,有的Queue有最大隊(duì)列長度限制,有的Queue沒有。注意到添加、刪除和獲取隊(duì)列元素總是有兩個(gè)方法,這是因?yàn)樵谔砑踊颢@取元素失敗時(shí),這兩個(gè)方法的行為是不同的。我們用一個(gè)表格總結(jié)如下:
throw Exception返回false或null
添加元素到隊(duì)尾
add(E e)
boolean offer(E e)
取隊(duì)首元素并刪除
E remove()
E poll()
取隊(duì)首元素但不刪除
E element()
E peek()
舉個(gè)栗子,假設(shè)我們有一個(gè)隊(duì)列,對(duì)它做一個(gè)添加操作,如果調(diào)用add()方法,當(dāng)添加失敗時(shí)(可能超過了隊(duì)列的容量),它會(huì)拋出異常:
Queue q =...try{
q.add("Apple");
System.out.println("添加成功");
}catch(IllegalStateException e) {
System.out.println("添加失敗");
}
如果我們調(diào)用offer()方法來添加元素,當(dāng)添加失敗時(shí),它不會(huì)拋異常,而是返回false:
Queue q =...if (q.offer("Apple")) {
System.out.println("添加成功");
}else{
System.out.println("添加失敗");
}
當(dāng)我們需要從Queue中取出隊(duì)首元素時(shí),如果當(dāng)前Queue是一個(gè)空隊(duì)列,調(diào)用remove()方法,它會(huì)拋出異常:
Queue q =...try{
String s=q.remove();
System.out.println("獲取成功");
}catch(IllegalStateException e) {
System.out.println("獲取失敗");
}
如果我們調(diào)用poll()方法來取出隊(duì)首元素,當(dāng)獲取失敗時(shí),它不會(huì)拋異常,而是返回null:
Queue q =...
String s=q.poll();if (s != null) {
System.out.println("獲取成功");
}else{
System.out.println("獲取失敗");
}
因此,兩套方法可以根據(jù)需要來選擇使用。
注意:不要把null添加到隊(duì)列中,否則poll()方法返回null時(shí),很難確定是取到了null元素還是隊(duì)列為空。
接下來我們以poll()和peek()為例來說說“獲取并刪除”與“獲取但不刪除”的區(qū)別。對(duì)于Queue來說,每次調(diào)用poll(),都會(huì)獲取隊(duì)首元素,并且獲取到的元素已經(jīng)從隊(duì)列中被刪除了:
import java.util.LinkedList;
import java.util.Queue;public classMain {public static voidmain(String[] args) {
Queue q = new LinkedList<>();//添加3個(gè)元素到隊(duì)列:
q.offer("apple");
q.offer("pear");
q.offer("banana");//從隊(duì)列取出元素:
System.out.println(q.poll()); //apple
System.out.println(q.poll()); //pear
System.out.println(q.poll()); //banana
System.out.println(q.poll()); //null,因?yàn)殛?duì)列是空的
}
}
如果用peek(),因?yàn)楂@取隊(duì)首元素時(shí),并不會(huì)從隊(duì)列中刪除這個(gè)元素,所以可以反復(fù)獲取:
import java.util.LinkedList;
import java.util.Queue;public classMain {public static voidmain(String[] args) {
Queue q = new LinkedList<>();//添加3個(gè)元素到隊(duì)列:
q.offer("apple");
q.offer("pear");
q.offer("banana");//隊(duì)首永遠(yuǎn)都是apple,因?yàn)閜eek()不會(huì)刪除它:
System.out.println(q.peek()); //apple
System.out.println(q.peek()); //apple
System.out.println(q.peek()); //apple
}
}
從上面的代碼中,我們還可以發(fā)現(xiàn),LinkedList即實(shí)現(xiàn)了List接口,又實(shí)現(xiàn)了Queue接口,但是,在使用的時(shí)候,如果我們把它當(dāng)作List,就獲取List的引用,如果我們把它當(dāng)作Queue,就獲取Queue的引用:
//這是一個(gè)List:
List list = new LinkedList<>();//這是一個(gè)Queue:
Queue queue = new LinkedList<>();
始終按照面向抽象編程的原則編寫代碼,可以大大提高代碼的質(zhì)量。
小結(jié)
隊(duì)列Queue實(shí)現(xiàn)了一個(gè)先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu):
通過add()/offer()方法將元素添加到隊(duì)尾;
通過remove()/poll()從隊(duì)首獲取元素并刪除;
通過element()/peek()從隊(duì)首獲取元素但不刪除。
要避免把null添加到隊(duì)列。
總結(jié)
以上是生活随笔為你收集整理的java队列转集合_Java集合 使用Queue的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 验证码 源码_java 验证码
- 下一篇: java 不支持fork_为什么Java