Queue 中 offer() 和 add() 的区别
Queue 中 offer() 和 add() 的区别
在编写代码时,发现自己用的 add(),别人用的 offer(),好像两个方法的功能是一致的,然后去看了一下 Queue 的实现类 LinkedList
的源码,发现并无区别。
既然没有区别,那为什么要分成两个方法呢?看了一下上面的注释:offer 在使用容量受限的队列时,此方法通常比 add 更可取,因为 add 只能通过引发异常来插入元素。
也就是说只有在容量受限的队列中,才能具体区分这两个方法,然后去看了一下 ArrayBlockingQueue
的源码
即,在顶层接口 Queue 中确实定义了方法的标准,但是具体的实现类可能会根据其特定的数据结构和用途,对这些方法的实现细节进行不同的处理。
知道了区别,那为什么 Queue 有了 add 方法(继承自 Collection) ,为什么还要定义一个 offer 方法呢?
查阅了许多文档,没有一个比较清晰明了的答案,但是在 What is the difference between the add and offer methods in a Queue in Java? - Stack Overflow 这个问题中可以从中发现一些信息,在下面提到了,Queue 首先是继承 Collection,自然他也拥有 add 方法,在 Collection 的 add 方法中,定义了如果集合出于除已包含元素以外的任何原因拒绝添加特定元素,则它必须引发异常。
但是队列我们知道分为有界队列和无界队列,在无界队列中的 offer 其实底层也就是 add,但在有界队列中,offer 就不太一样了,也就是 offer 设计出来的意义。在 Queue 的 offer 方法 中, 定义了设计用于在失败被视为正常情况而非异常情况时使用,例如,在固定容量(或称为“有界”)的队列中。