我想知道这篇教程在引用下面的解释时是什么意思。特别是我用粗体突出显示的部分。
addfirst
和offerFirst
方法在开头插入元素Deque
实例。方法addLast
和offerLast
插入元素在Deque
实例的末尾。当Deque
实例受到限制,首选的方法是offerFirst
和offerLast
,因为如果是,addFirst
可能无法抛出异常满的。
- 为什么首选offerFirst ?
- 为什么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不会抛出任何异常