【问题标题】:why do we have offer(E e) and offerLast(E e) methods in Deque, even though they solve the same purpose为什么我们在 Deque 中有 offer(E e) 和 offerLast(E e) 方法,即使它们解决了相同的目的
【发布时间】:2018-08-31 16:46:39
【问题描述】:

我试图理解,为什么我们需要Deque 中的Offer 和OfferLast 方法,因为这两种方法都在Deque 的末尾/尾部添加元素。它有什么意义?

【问题讨论】:

    标签: java collections java-6 deque


    【解决方案1】:

    Queue 接口是在 Java 5 中添加的。它定义了 offer 方法,该方法在末尾添加一个元素。

    (offer 方法和add 方法都返回布尔值。它们的不同之处在于,add 被允许拒绝元素并且只有当元素已经存在于集合中时才返回 false。offer方法可以出于其他原因拒绝该元素,例如队列已满。)

    对于Queue.offer,语义几乎没有问题,因为元素通常添加到队列的尾部并从头部移除。

    Deque 接口是在 Java 6 中添加的。双端队列允许向头部和尾部添加和删除元素,因此 Deque 定义了 offerFirst 和 offerLast方法。双端队列也是队列,所以Deque 是Queue 的子接口。因此它从Queue 继承了offer 方法。这就是Deque 以offer 和offerLast 结尾的方式。

    我们可能不添加offerLast 就可以解决问题,但这会在Deque 界面中留下不对称性。许多操作在头部和尾部都起作用(添加、获取、提供、查看、轮询、删除),因此所有操作都具有 -first 和 -last 变体是有意义的,即使这会增加冗余。其他Queue 方法也会出现这种冗余,例如add 和addLast、peek 和peekFirst、poll 和pollFirst,以及remove 和removeFirst。

    【讨论】:

      【解决方案2】:

      因此您可以将同一个对象同时用作队列和双端队列。

      【讨论】:

      • 但是由于 Deque 正在扩展 Queue,为什么我们不能使用与 Queue 相同的方法呢?
      • 另外,offer方法是依次调用OfferLast。 public boolean offer(E e) { return offerLast(e); }
      • 这是一个界面设计问题,仅此而已。出于清晰的原因,设计师更喜欢使用 offerFirst() 和 offerLast(),而不是使用 offerFirst() 和 offer()。
      • 但我的问题是,有一个方法叫做 Offerlast() 和 Offer()。为什么我们两者都需要?
      • 两者都不需要,但 Deque 类的设计者发现最好添加一个 offerLast() 方法,这样程序员就可以编写更易于阅读的代码。
      猜你喜欢
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 2011-01-11
      相关资源
      最近更新 更多