LinkedList中add,addLast,offer,offerLast,pollLast,removeLast,peekLast,getLast等方法的区别

首先需要知道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)

AnonyEast

一个爱折腾的技术萌新

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐