在Java中插入Deque



我想知道这篇教程在引用下面的解释时是什么意思。特别是我用粗体突出显示的部分。

addfirstofferFirst方法在开头插入元素Deque实例。方法addLastofferLast插入元素在Deque实例的末尾。Deque实例受到限制,首选的方法是offerFirstofferLast,因为如果是,addFirst可能无法抛出异常满的。

  1. 为什么首选offerFirst ?
  2. 为什么addFirst不能抛出一个异常如果它是满的?如果保证在这些情况下抛出异常,不是更好吗?

我认为这两个方法都是合法的(尽管offerXXX方法更有可能用于有界脱队列)。

如果您的代码假设队列中有可用空间,并且这个假设对代码的正确性至关重要,请使用addFirst/addLast。抛出的运行时异常(IllegalStateException)非常适合这种bug场景。

另一方面,如果队列满是正常情况,则不要使用异常处理它。使用offerFirst/offerLast,并检查返回值

如果队列有达到容量的风险,那么首选的方法是OfferFirst。如果它已经达到容量addFirst将抛出一个异常,而作为offerFirst返回一个布尔值(true/false)来指示添加是否成功。将指定的元素插入到队列的前面,除非它会违反容量限制。当使用有容量限制的队列时,此方法通常优于addFirst(E)方法,后者只能通过抛出异常而无法插入元素。

当使用受限版本时,您不希望在添加元素失败时抛出异常。这是因为你会预料到一些失败,这就是为什么你主动提出添加,而不是坚持添加。

这意味着offerXXX方法返回boolean,而addXXX方法不返回。

因此,建议您使用offerXXX并检查布尔值是否成功,而不是期望从任何方法抛出异常。

这是非常糟糕的措辞。Javadoc也是如此

根据Docs:

offerFirst:

Inserts the specified element at the front of this deque unless it would violate capacity restrictions. When using a capacity-restricted deque, this method is generally preferable to the addFirst(E) method, which can fail to insert an element only by throwing an exception.

这意味着如果你使用容量受限deque的addFirst,它可能会抛出一个异常,但使用offerFirst不会抛出任何异常。

offerLast

Inserts the specified element at the end of this deque unless it would violate capacity restrictions. When using a capacity-restricted deque, this method is generally preferable to the addLast(E) method, which can fail to insert an element only by throwing an exception.

同样,如果你使用容量受限的deque的addLast,它可能会抛出一个异常,但使用offerLast不会抛出任何异常

最新更新