首先需要知道LinkedList实现了Deque接口,而Deque接口继承了Queue接口,因此LinkedList实际上是一个队列,而且是双端队列,底层则采用双向链表来实现这个队列。
一、add()、addLast() 、offer()、offerLast()的区别
四个方法都是将元素添加到队列尾部,区别在于:
1.add、offer、offerLast方法在插入成功后会返回true,而addLast无返回值。
2.在LinkedList中,add、offer的方法是一样的,因为调用offer实际上就是调用add方法。但在队列容量有限制的情况下,若添加失败,offer方法返回false,add方法抛异常。
3.addLast和offerLast的区别,仅仅是前者无返回值,后者有返回值true而已。
public boolean add(E e) {
linkLast(e);
return true;
}
public boolean offer(E e) {
return add(e);
}
public void addLast(E e) {
linkLast(e);
}
public boolean offerLast(E e) {
addLast(e);
return true;
}
同理可得,addFirst只是将元素插入到队头,无返回值,而offerFirst会返回true。
综上,将元素添加到队列尾部时,推荐使用:offer
若要指定插入位置,则使用:add(int index, E element)
二、pollLast()与removeLast()区别
两个方法都是弹出队列尾部的元素,并返回元素的值,区别在于:
当队列为空时,pollLast返回null,而removeLast抛异常。
显然pollLast更好。
pollFirst和removeFirst同理,源码如下:
public E removeFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
public E pollFirst() {
final Node<E> f = first;
return (f == null) ? null : unlinkFirst(f);
}
三、peek()、peekFirst()、getFirst()的区别
这三个方法都是获取队列头部元素的值,但不弹出,区别在于:
当队列为空时,peek和peekFirst方法返回null,而getFirst会抛异常。
同理可得,peekLast和getLast方法会返回队列尾部元素的值,当队列为空时,peekLast返回null,getLast抛异常。
四、总结
1.在队尾添加元素优先使用:offer()
2.删除队头/队尾元素优先使用:pollFirst()、 pollLast()
3.获取队头/队尾元素优先使用:peek()或peekFirst()、peekLast()
4.添加元素到指定位置:add(int index, E element)
5.获取指定位置的元素:get(int index)




1 Comment
精英移动代理