美文网首页
Java的LinkedList/Deque中add/offer/

Java的LinkedList/Deque中add/offer/

作者: 萤火虫叔叔 | 来源:发表于2022-03-25 03:56 被阅读0次

    最近在使用LinkedList/Deque的时候,发现其中有很多类似的方法,我就想简简单单做个添加/删除的操作,发现竟然有那么多类似的方法,比如“添加”操作可以用的方法有:add/offer/push/offerFirst/offerLast,“删除”操作可以用的方法有:remove/pop/poll/pollFirst/pollLast

    经过一番学习和测试以后,得出以下结论:这些方法从设计之初,分别来自于集合Collections,队列Queue,栈Stack,双端队列Deque,因此它们是有语义的,不建议笼统归为添加/删除。

    • addremove是一对,源自Collection
    • offerpoll是一对,源自Queue
    • pushpop是一对,源自Deque,其本质是栈(Stack类由于某些历史原因,官方已不建议使用,使用Deque代替);
    • offerFirst/offerLastpollFirst/pollLast是一对,源自Deque,其本质是双端队列。

    那为什么这些方法,全都出现在LinkedList/Deque中呢,那是由它们的继承关系导致的,请看下图。

    image.png
    关注圈住的部分,接口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删除队尾。

    虽说某几个方法等价,但是我们在使用的时候,建议根据用途来使用不同的方法,比如你想把LinkedList当做集合list,那么应该用add/remove,如果想用作队列,则使用offer/poll,如果用作栈,则使用push/pop,如果用作双端队列,则使用offerFirst/offerLast/pollFirst/pollLast。根据语义使用,就不会发生:我想删队尾,结果删了队头这种事了。

    相关文章

      网友评论

          本文标题:Java的LinkedList/Deque中add/offer/

          本文链接:https://www.haomeiwen.com/subject/zkdrjrtx.html