天天看點

Java集合-Deque

Deque(

java.util.Deque

)接口代表着雙向隊列,意思就是可以從隊列的兩端增加或者删除元素,Deque就是雙向Queue的意思。

Deque的實作

既然

Deque

是個接口是以初始化時就要用到其具體的實作,在

 Collections API中有下面兩種實作:

  • java.util.LinkedList
  • java.util.ArrayDeque

LinkedList

類是非常标準的Deque

Queue

的實作,它在内部使用連結清單來模組化

queue

或deque。

ArrayDeque

類内部存儲元素是數組,如果元素數超過數組中的空間,則配置設定一個新的數組,并移動所有元素,換句話說,ArrayDeque根據需要增長,即使它将元素存儲在數組中。

建立Deque

在使用

Deque

之前首先要建立

Deque

接口實作的執行個體,下面是建立

LinkedList

執行個體:

Deque deque = new LinkedList();
           

建立 

ArrayDeque

執行個體:

Deque deque = new ArrayDeque();
           

Deque泛型

預設 

Deque

放入的Object對象,但是也可以用泛型:

Deque<MyObject> deque = new LinkedList<MyObject>();
           

這個

Deque

中隻能添加

MyObject

的執行個體對象,并且通路時不需要強制類型轉換:

MyObject myObject = deque.remove();

for(MyObject anObject : deque){
   //do someting to anObject...
}
           

Deque中添加元素

前面講到可以在

Deque

 的兩端增加元素,

Deque

 中有下面幾種添加元素的方法:

  • add()
  • addLast()
  • addFirst()
  • offer()
  • offerFirst()
  • offerLast()

這些方法下面會一一講解。

add()

可以使用

add()

方法在Deque

 的尾部添加元素:

Deque<String> deque = new ArrayDeque<>();

deque.add("element 1");
           

如果元素不能插入到Deque,那麼

add()

方法将抛異常,這個和

offer()

方法不一樣,如果不能添加元素offer()方法将傳回false。add()方法實際是繼承Queue

接口。

addLast()

addLast()

方法也可以在

Deque

的尾部添加元素,

這是Deque接口與從Queue接口繼承的add()方法等效:

Deque<String> deque = new ArrayDeque<>();

deque.addLast("element 1");
           

如果Deque中不能添加元素則

addLast()

方法會抛異常, offerLast()方法則會傳回false。

addFirst()

可以使用 

Deque

addFirst()

方法在Deque的頭部添加元素:

Deque<String> deque = new ArrayDeque<>();

deque.addFirst("element 1");
           

如果Deque不能添加元素,

addFirst()

方法會抛異常, offerFirst()方法則傳回

false

offer()

offer()

方法可以在

Deque的尾部添加元素,如果元素沒滿則添加成功傳回true,否則傳回false。這是和 

add()

抛異常方法不同的地方,下面是使用offer()

方法:

Deque<String> deque = new ArrayDeque<>();

deque.offer("element 1");
           

offerLast()

offerLast()

方法在

Deque的尾部添加元素,和

offer()

類似,

方法名offerLast()隻是稍微說明了元素添加到Deque的位置,如果Deque中添加元素成功則傳回true否則傳回false,和

addLast()

添加失敗的抛異常不一樣,下面是使用offerLast()

方法:

Deque<String> deque = new ArrayDeque<>();

deque.offerLast("element 1");
           

offerFirst()

offerFirst()

方法是在

 Deque 的頭部添加元素,如果添加成功傳回true,否則傳回false:

Deque<String> deque = new ArrayDeque<>();

deque.offerFirst("element 1");
           

push()

push()

方法是在

Deque的頭部添加元素,如果Deque中的元素滿了,則會抛異常,這和

addFirst()

方法比較相似

Deque<String> deque = new LinkedList<>();

deque.push("element 0");
           

可以檢視Deque中的元素

可以檢視

Deque

中的第一個或者最後一個元素,檢視元素意味着擷取元素的引用而不是移除元素,有下面幾種方法:

  • peek()
  • peekFirst()
  • peekLast()
  • getFirst()
  • getLast()

peek()

peek()

傳回

Deque中的第一個元素并且不擅長,如果Deque是空則傳回null:

Deque<String> deque = new ArrayDeque<>();

deque.add("first element");
deque.add("last element");

String firstElement = deque.peek();
           

執行完代碼後

firstElement

将指向

Deque的第一個元素: "first element"。

peekFirst()

peekFirst()

方法傳回

Deque的第一個元素,如果Deque是空則傳回null,這和 

peek()

非常相似:

Deque<String> deque = new ArrayDeque<>();

deque.add("first element");
deque.add("last element");

String firstElement = deque.peekFirst();
           

執行完代碼後

firstElement

的值是

: "first element"。

peekLast()

Deque

中可以通過peekLast()方法檢視最後一個元素,如果

Deque是空則傳回null: 

Deque<String> deque = new ArrayDeque<>();

deque.add("first element");
deque.add("last element");

String lastElement = deque.peekLast();
           

執行完代碼後

lastElement

的值是:“last element”

getFirst()

getFirst()

方法擷取

Deque的第一個元素并且不删除,如果Deque是空則抛異常:

Deque<String> deque = new ArrayDeque<>();

deque.add("first element");
deque.add("last element");


String firstElement = deque.getFirst();
           

執行完代碼後

firstElement

的值是

: "first element"。

getLast()

getLast()

擷取Deque

的最後一個元素,如果Deque是空則傳回null:

Deque<String> deque = new ArrayDeque<>();

deque.add("first element");
deque.add("last element");

String lastElement = deque.getLast();
           

執行代碼後

lastElement

的值是

 :“

last element

”。

移除Deque中的元素

以下幾種方法可以移除Deque 中的元素:

  • remove()
  • removeFirst()
  • removeLast()
  • poll()
  • pollFirst()
  • pollLast()

remove()

remove()

方法移除

Deque中的第一個元素并傳回:

Deque<String> deque = new LinkedList<>();

deque.add("element 0");

String removedElement = deque.remove();
           

如果Deque 是空則抛異常,這一點和

poll()

傳回null不一樣。

removeFirst()

removeFirst()

方法同樣移除Deque

中的第一個元素: 

Deque<String> deque = new LinkedList<>();

deque.add("element 0");

String removedElement = deque.removeFirst();
           

如果Deque是空,則

removeFirst()

将抛異常,這和pollFirst()傳回null不一樣。

removeLast()

removeLast()

方法移除Deque

中的最後一個元素:

Deque<String> deque = new LinkedList<>();

deque.add("element 0");
deque.add("element 1");
deque.add("element 2");

String removedElement = deque.removeLast();
           

removedElement

變量的值是element 2

 ,如果

Deque

是空則會抛異常與

pollLast()

傳回null不一樣。

poll()

poll()

方法移除Deque中的第一個元素,如果Deque為空則poll()

傳回

null

,這和

remove()

方法抛異常不一樣:

Deque<String> deque = new LinkedList<>();

deque.add("element 0");
deque.add("element 1");
deque.add("element 2");

String removedElement = deque.poll();
           

pollFirst()

pollFirst()

方法移除Deque中的第一個元素,和poll()非常相似,如果Deque是空則傳回null,和removeFirst()抛異常不一樣:

Deque<String> deque = new LinkedList<>();

deque.add("element 0");
deque.add("element 1");
deque.add("element 2");

String removedElement = deque.pollFirst();
           

pollLast()

pollLast()

移除Deque的最後一個元素,如果Deque是空則傳回null,這和removeLast()抛異常不一樣

Deque<String> deque = new LinkedList<>();

deque.add("element 0");
deque.add("element 1");
deque.add("element 2");

String removedElement = deque.pollLast();
           

pop()

pop()

方法移除Deque的第一個元素,如果Deque是空則抛異常:

Deque<String> deque = new LinkedList<>();

deque.push("element 0");

String removedElement = deque.pop();
           

檢查Deque是否包含某個元素

可以用

contains()

方法檢查

Deque中是否包含某個元素,如果包含傳回true否則傳回false:

Deque<String> deque = new ArrayDeque<>();

deque.add("first element");

boolean containsElement1 = deque.contains("first element");
boolean containsElement2 = deque.contains("second element");
           

執行完代碼後

containsElement1

的值是true

 ,

containsElement2

值是

false

Deque的大小

Deque的

size()

方法可以傳回

Deque中存儲的元素個數: 

Deque<String> deque = new ArrayDeque<>();

deque.add("first element");
deque.add("second element");

int size = deque.size();
           

執行完代碼後

size

大小是2,因為Deque中包含兩個元素。

疊代Deque中的元素

可以通過兩種方法疊代

Deque

中的元素:

  • 使用

    Iterator

    .
  • 使用for-each循環.

具體使用哪一種疊代取決Deque的實作。

通過疊代器疊代Deque

第一種方法是擷取

Deque

的Iterator,下面是代碼: 

Deque<String> deque = new LinkedList<>();

deque.add("element 0");
deque.add("element 1");
deque.add("element 2");

Iterator<String> iterator = deque.iterator();
while(iterator.hasNext(){
  String element = iterator.next();
}
           

通過For-Each循環疊代Deque

第二種方法是通過for-each循環疊代Deque:

Deque<String> deque = new LinkedList<>();

deque.add("element 0");
deque.add("element 1");
deque.add("element 2");

for(String element : deque) {
    System.out.println(element);
}
           

參考:

http://tutorials.jenkov.com/java-collections/deque.html

https://blog.csdn.net/cgsyck/article/details/108569520

https://blog.csdn.net/cgsyck/article/details/108276863