最近在使用LinkedList/Deque
的时候,发现其中有很多类似的方法,我就想简简单单做个添加/删除的操作,发现竟然有那么多类似的方法,比如“添加”操作可以用的方法有:add/offer/push/offerFirst/offerLast
,“删除”操作可以用的方法有:remove/pop/poll/pollFirst/pollLast
。
经过一番学习和测试以后,得出以下结论:这些方法从设计之初,分别来自于集合Collections
,队列Queue
,栈Stack
,双端队列Deque
,因此它们是有语义的,不建议笼统归为添加/删除。
-
add
和remove
是一对,源自Collection; -
offer
和poll
是一对,源自Queue; -
push
和pop
是一对,源自Deque,其本质是栈(Stack类由于某些历史原因,官方已不建议使用,使用Deque代替); -
offerFirst/offerLast
和pollFirst/pollLast
是一对,源自Deque,其本质是双端队列。
那为什么这些方法,全都出现在LinkedList/Deque
中呢,那是由它们的继承关系导致的,请看下图。
关注圈住的部分,接口Deque继承了以上所有的方法,而类LinkedList实现了以上所有的方法。
注:由于历史原因,在Java中,官方不建议使用Stack类,而是使用Deque
代替,也就是说,接口Deque
是栈和双端队列这两种数据结构的集合体。
说了这么多,这一堆方法到底有什么区别?其实从他们的出处便可以快速区分并且牢记他们的不同之处。
-
add/remove
源自集合,所以添加到队尾,从队头删除; -
offer/poll
源自队列(先进先出 => 尾进头出),所以添加到队尾,从队头删除; -
push/pop
源自栈(先进后出 => 头进头出),所以添加到队头,从队头删除; -
offerFirst/offerLast/pollFirst/pollLast
源自双端队列(两端都可以进也都可以出),根据字面意思,offerFirst
添加到队头,offerLast
添加到队尾,pollFirst
从队头删除,pollLast
从队尾删除。
总结: -
add/offer/offerLast
添加队尾,三个方法等价; -
push/offerFirst
添加队头,两个方法等价。 -
remove/pop/poll/pollFirst
删除队头,四个方法等价; -
pollLast
删除队尾。
网友评论