Java中的Queue
實現有兩種刪除元素的方法,一種是拋出異常的remove()
,另一種是poll()
,它返回空的隊列的null
。我有兩個疑問:爲什麼Java提供了兩種從隊列中移除元素的方法?
- 爲什麼
Queue
有不同的實現來刪除元素? - 哪個實現何時使用?
Java中的Queue
實現有兩種刪除元素的方法,一種是拋出異常的remove()
,另一種是poll()
,它返回空的隊列的null
。我有兩個疑問:爲什麼Java提供了兩種從隊列中移除元素的方法?
Queue
有不同的實現來刪除元素?當你知道如何正確的反應,現在和/或期望的元素是不存在,然後使用輪詢。
否則使用刪除。
有時候你想爲一個空隊列返回空值,有時你想它來治療空隊列作爲例外情況。
這兩種方法都在約隊列結構經典討論使用不同。我主要使用poll()來檢索項目,remove()主要是如果我需要修改正常循環外的隊列。
在某些情況下,預計隊列將是空的,並且在那些情況下有一個不引發異常的方法是適當的。在其他情況下,這是一個例外情況,該隊列是空的,並且例外是適當的。
拋出異常會導致性能損失,並且如果您希望隊列不時被清空,您不希望處理隊列空邏輯作爲捕獲異常 - 它是既昂貴又難以閱讀。
在相反的情況下,您不希望隊列永遠爲空,這是一個編程錯誤或其他異常情況的跡象,而且您不想編寫醜陋的錯誤條件檢查代碼(例如,檢查null),因爲在這種情況下,它比捕獲異常(可以在另一個範圍內執行)更不可讀。
抽象類AbstractQueue<E>
實現Queue<E>
並定義remove方法。
你可以看看源代碼:
public E remove() {
E x = poll();
if (x != null)
return x;
else
throw new NoSuchElementException();
}
所以,你可以看到,remove()
方法使用poll()
方法。
你可以使用你喜歡的一種。在回答
我正在使用此poll()調用我的隊列實現。令人驚訝的是,它拋出了NoSuchElementException。任何解釋? -.- – 2014-03-04 09:01:31
也許你同時訪問隊列? – 2016-02-11 14:25:11
看,這不是很清楚,我這做了什麼,因此:
直從API: 刪除()和poll()方法,在他們的行爲只不同的時隊列爲空:remove()方法拋出一個異常,而poll()方法返回null
Remove()
方法不同於輪詢僅在於如果此隊列爲空則拋出異常。
你最好通過這個文本使用>來引用 – 2016-09-26 22:32:33
這個答案解釋的基本區別,只是不知道,這引發異常,並沒有。 – Achow 2012-12-21 08:05:23