最近在使用LinkedList/Deque
的時候,發(fā)現(xiàn)其中有很多類似的方法览绿,我就想簡簡單單做個添加/刪除的操作,發(fā)現(xiàn)竟然有那么多類似的方法穗慕,比如“添加”操作可以用的方法有:add/offer/push/offerFirst/offerLast
饿敲,“刪除”操作可以用的方法有:remove/pop/poll/pollFirst/pollLast
。
經過一番學習和測試以后逛绵,得出以下結論:這些方法從設計之初怀各,分別來自于集合Collections,隊列Queue术浪,棧Stack瓢对,雙端隊列Deque,因此它們是有語義的胰苏,不建議籠統(tǒng)歸為添加/刪除硕蛹。
-
add
和remove
是一對,源自Collection
硕并; -
offer
和poll
是一對法焰,源自Queue
; -
push
和pop
是一對鲤孵,源自Deque
壶栋,其本質是棧(Stack
類由于某些歷史原因,官方已不建議使用普监,使用Deque
代替)贵试; -
offerFirst/offerLast
和pollFirst/pollLast
是一對,源自Deque
凯正,其本質是雙端隊列毙玻。
那為什么這些方法,全都出現(xiàn)在LinkedList/Deque
中呢廊散,那是由它們的繼承關系導致的桑滩,請看下圖。
關注圈住的部分允睹,接口
Deque
繼承了以上所有的方法运准,而類LinkedList
實現(xiàn)了以上所有的方法。注:由于歷史原因缭受,在Java中胁澳,官方不建議使用Stack類,而是使用
Deque
代替米者,也就是說韭畸,接口Deque
是棧和雙端隊列這兩種數(shù)據(jù)結構的集合體宇智。
說了這么多,這一堆方法到底有什么區(qū)別胰丁?其實從他們的出處便可以快速區(qū)分并且牢記他們的不同之處随橘。
-
add/remove
源自集合,所以添加到隊尾锦庸,從隊頭刪除机蔗; -
offer/poll
源自隊列(先進先出 => 尾進頭出),所以添加到隊尾酸员,從隊頭刪除蜒车; -
push/pop
源自棧(先進后出 => 頭進頭出)讳嘱,所以添加到隊頭幔嗦,從隊頭刪除; -
offerFirst/offerLast/pollFirst/pollLast
源自雙端隊列(兩端都可以進也都可以出)沥潭,根據(jù)字面意思邀泉,offerFirst
添加到隊頭,offerLast
添加到隊尾钝鸽,pollFirst
從隊頭刪除汇恤,pollLast
從隊尾刪除。
總結: -
add/offer/offerLast
添加隊尾拔恰,三個方法等價因谎; -
push/offerFirst
添加隊頭,兩個方法等價颜懊。 -
remove/pop/poll/pollFirst
刪除隊頭财岔,四個方法等價; -
pollLast
刪除隊尾河爹。
雖說某幾個方法等價匠璧,但是我們在使用的時候,建議根據(jù)用途來使用不同的方法咸这,比如你想把LinkedList
當做集合list
夷恍,那么應該用add/remove
,如果想用作隊列媳维,則使用offer/poll
酿雪,如果用作棧,則使用push/pop
侄刽,如果用作雙端隊列指黎,則使用offerFirst/offerLast/pollFirst/pollLast
。根據(jù)語義使用唠梨,就不會發(fā)生:我想刪隊尾袋励,結果刪了隊頭這種事了。