LinkedList中pop()、remove()与poll()的真实差异及疑问
LinkedList中pop()、poll()和remove()的差异详解
你的理解完全正确:remove()确实比pop()多了支持传入索引删除元素的特性,三者的具体差异如下:
1. pop()
- 属于
Deque接口定义的方法,LinkedList因实现了Deque而拥有该方法 - 功能:仅能删除并返回列表的首元素(LinkedList作为栈使用时,push操作是往头部添加元素,pop对应从头部取出删除)
- 空列表场景:抛出
NoSuchElementException异常 - 无重载方法,只能操作首元素
2. poll()
- 同样属于
Deque接口定义的方法 - 功能:删除并返回列表的首元素
- 空列表场景:返回
null,不会抛出异常 - 无重载方法,只能操作首元素
3. remove()
LinkedList提供了多个重载的remove()方法,核心特性比前两者更丰富:
- 无参remove():行为和
pop()完全一致——删除并返回首元素,列表为空时抛出NoSuchElementException - remove(int index):删除指定索引位置的元素,返回被删除的元素;若索引超出列表范围(小于0或大于等于列表长度),会抛出
IndexOutOfBoundsException - 额外还有
remove(Object o):删除列表中第一个匹配指定元素的节点,返回boolean表示是否删除成功
结合你的代码示例解释
你的代码中,push()是往LinkedList的头部添加元素,所以执行完5次push后,列表实际顺序为[5, 4, 3, 2, 1]:
LinkedList<Integer> list = new LinkedList<>(); list.push(1); // 列表:[1] list.push(2); // 列表:[2, 1] list.push(3); // 列表:[3, 2, 1] list.push(4); // 列表:[4, 3, 2, 1] list.push(5); // 列表:[5, 4, 3, 2, 1] list.pop(); // 删除首元素5,剩余列表:[4, 3, 2, 1] // or list.poll(); // 删除首元素5,剩余列表:[4, 3, 2, 1] // or list.remove(3); // 删除索引3的元素2,剩余列表:[5, 4, 3, 1]
关键差异总结
pop()和无参remove()功能、异常行为完全一致,但前者来自Deque接口,后者来自List接口poll()和前两者的核心区别是:空列表时返回null而非抛出异常remove()支持按索引、按元素删除的多场景操作,而pop()和poll()仅能操作列表首元素
内容的提问来源于stack exchange,提问作者Karlz-Bandz
相关产品推荐
相关产品推荐

