技术分享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 中的页面底部(与正文同页,便于管理)。
暂无评论,欢迎抢沙发。