我最近发现java API中的链表有两种类似的方法,它们都删除第一个节点并返回它。我编写了以下代码进行测试,他们做了完全相同的事情。他们真的完全一样吗?
test.add(1);
test.add(2);
test.add(3);
System.out.println(test.pop());
for(int i = 0; i < test.size();i++ ){
System.out.print(test.get(i) + " ");
}
System.out.println("");
System.out.println(test.poll());
for(int i = 0; i < test.size();i++ ){
System.out.print(test.get(i) + " ");
}
System.out.println("");
感谢!!!
答案 0 :(得分:20)
答案 1 :(得分:5)
它们在功能上是等价的(除了它们如何处理空列表的情况),但是你得到两个变体,因为public E poll() {
final Node<E> f = first;
return (f == null) ? null : unlinkFirst(f);
}
public E pop() {
return removeFirst();
}
public E removeFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
是队列和栈的实现(即Queue
和Deque
)。
您可以在source code中看到他们的实现:
poll()
如果列表为空,则pop()
返回null,removeFirst()
(和NoSuchElementException
)会引发pop()
。这使得{{1}}使用的方法更加精确,因为您不必处理空值。