为什么我们在 Deque 中有 Offer(E e) 和 OfferLast(E e) 方法,即使它们解决相同的目的

问题描述 投票:0回答:3

我试图理解,为什么我们需要

Offer
中的
OfferLast
Deque
方法,因为这两种方法都在
Deque
的末尾/尾部添加元素。它有什么意义?

java collections java-6 deque
3个回答
11
投票

Java 5 中添加了 Queue 接口。它定义了

offer
方法,该方法在末尾添加一个元素。

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

使用

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

Java 6 中添加了 Deque 接口。双端队列允许在头部和尾部添加和删除元素,因此 Deque 定义了

offerFirst
offerLast
方法。双端队列也是队列,因此
Deque
Queue
的子接口。因此它继承了
offer
Queue
方法。这就是
Deque
最终得到
offer
offerLast
的原因。

我们可能可以在不添加

offerLast

的情况下完成,但这会在

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


0
投票


0
投票

这是简单的区别:

Offer:

该方法将一个元素添加到双端队列的末尾(尾部),但它不指定双端队列中的确切位置。它只是说,“将此元素添加到末尾。”

OfferLast:

此方法显式地将一个元素添加到双端队列的最末尾(尾部)。它指定元素应该到达双端队列的绝对末尾。 这种差异的意义在于,在一些 Deque 实现中,尤其是那些提供各种插入点(例如,头部和尾部)的实现中,使用 OfferLast 可以确保将元素放置在最末尾,而不会产生歧义。

但是,在许多常见的 Deque 实现中,Offer 和 OfferLast 的行为可能相同,因为它们都将元素添加到尾部。当您使用更专业的双端队列结构时,这种区别变得更加重要,在这种结构中,您可能有多个插入点或对可以添加元素的位置有特定的限制。

因此,简单来说,Offer 和 OfferLast 可以让您灵活地向 Deque 添加元素,并且在您想要明确元素去向的特定场景中,差异更为重要。对于许多标准用例,您可以互换使用任一方法。

© www.soinside.com 2019 - 2024. All rights reserved.