Notion Blog
技术分享1 分钟阅读

LinkedList的add(E e)addLast(E e)offerLast(E e)这些尾部添加有什么区别

LinkedList中的add()、addLast()和offerLast()这三个方法都用于向链表尾部添加元素

但是在一些情况下的处理上有略微的区别:

add(E e)
将指定的元素添加到链表尾部
如果添加失败了,会抛出异常
addLast(E e)
将指定的元素添加到链表尾部
如果添加失败了,会抛出异常
它就是add()方法的同义词,完全一样
offerLast(E e)
将指定的元素添加到链表尾部
如果添加失败了,不会抛出异常,只是返回false

所以区别主要在于添加失败的情况下:

add()和addLast()会抛出异常
offerLast()只返回false

另外,在命名上offerLast()更符合Queue的数据结构的语义。

所以一般来说,如果需要容错处理,选择offerLast()是更好的选择。它不会抛出异常,也从方法名上能清楚地表达出意图。

那为什么会添加失败呢

内存不足 LinkedList的每个元素都需要分配内存。如果JVM堆内存已满,就无法成功分配内存来存储新元素,此时添加元素会失败并抛出OutOfMemoryError。
容量限制 LinkedList没有指定容量限制,但是如果在构造LinkedList对象时指定了一个最大容量,那么当链表元素个数达到指定最大容量时,后续的添加操作会失败。
其他并发修改 在多线程环境下,如果同时有多个线程正在对同一个LinkedList进行写操作,很可能会导致修改冲突而添加失败。
链表结构受损 如果因程序错误导致了链表内部的数据结构被破坏,那么后续的添加操作也会失败。

所以使用offerLast()而不是add()可以避免添加元素失败时不必要的异常抛出。 offerLast()方法会主动判断是否可以成功添加,如果无法成功添加则会安全地返回false。

这也体现了Fail-Fast vs Fail-Safe的设计思想的不同。

有关使用上的问题,欢迎您在底部评论区留言,一起交流~

读者评论

评论会同步写入该文在 Notion 中的页面底部(与正文同页,便于管理)。

0/1500

暂无评论,欢迎抢沙发。