首先需要知道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
精英移动代理