JDK 1.8源码阅读 LinkList

一,前言  

  LinkedList是一个实现了List接口和Deque接口的双端链表。有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端。 LinkedList不是线程安全的。

二,LinkList结构

  LinkList内部是一个双向列表的结构,如下图所示。

  

三,LinkList源码阅读

  3.1 LinkList的继承关系

     

   从继承关系可以看出,LinkedList不但继承了List接口同时也继承了Queue接口。

  3.2 LinkedList的构造方法

public LinkedList() {} // 空参构造

public LinkedList(Collection<? extends E> c) {
      this();
      addAll(c);
} // 带参构造,传入一个集合对象

  3.3 LinkedList的常用方法

public E getFirst() {}  // 获取第一个元素

public E getLast() {} // 获取最后一个节点元素

public E removeFirst() {} // 删除最开始节点元素,并将改元素返回

public E removeLast() {} // 删除最后节点元素,并将改元素返回

public void addFirst(E e) {} // 最前面添加节点元素

public void addLast(E e) {} //添加最后节点元素

public boolean contains(Object o) {} // 判断元素是否存在

public int size() {} // 返回集合长度

public boolean add(E e) {} // 最末尾添加

public boolean remove(Object o) {} // 最末尾删除

public boolean addAll(Collection<? extends E> c) {} // 将一个集合添加到Linkedlist

public boolean addAll(int index, Collection<? extends E> c) {} // 指定索引位置后开始添加集合

public void clear() {} // 清空

// Positional Access Operations

public E get(int index) {} // 更具索引获取数据

public E set(int index, E element) {} // 将指定位置的数字进行替换

public void add(int index, E element) {} // 指定索引添加

public E remove(int index) {} // 删除指定索引位置数据

// Search Operations

public int indexOf(Object o) {} // 返回指定元素的索引

public int lastIndexOf(Object o) {} // 最后一次出现该元素的索引

// Queue operations. 队列方式,增删更快

public E peek() {} // 返回第一个,该方法笔者测试了感觉没什么用,可能没有理解深刻。

public E element() {} // 返回第一个元素

public E poll() {} // 返回和删除第一个元素

public E remove() {} // 返回和删除第一个元素

public boolean offer(E e) {} // 最后面添加元素

public boolean offerFirst(E e) {} // 开始添加元素

public boolean offerLast(E e) {} // 最后添加元素

public E peekFirst() {} // 返回第一个

public E peekLast() {} // 返回最后一个

public E pollFirst() {} // 返回和删除第一个元素

public E pollLast() {} // 返回和删除最后元素

public void push(E e) {} // 前面添加

public E pop() {} // 删除并返回第一个

public boolean removeFirstOccurrence(Object o) {} // 删除第一个

public boolean removeLastOccurrence(Object o) {} // 删除最后一个

public ListIterator<E> listIterator(int index) {} 


/**
 * @since 1.6
 */
public Iterator<E> descendingIterator() {} // 转换迭代对象

public Object clone() {} // 复制一个

public Object[] toArray() {} // 转化成数组

@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {}


/**
 * @since 1.8
 */
@Override
public Spliterator<E> spliterator() {}

  从方法中发现,有很多相同功能的方法,但是在效率上会有一定的差别。用队列的方式进行添加效率更高。

四,总结 

  LinkedList是基于双端链表的List,其内部的实现源于对链表的操作,所以适用于频繁增加、删除的情况;该类不是线程安全的;另外,由于LinkedList实现了Queue接口,所以LinkedList不止有队列的接口,还有栈的接口,可以使用LinkedList作为队列和栈的实现。

原文地址:https://www.cnblogs.com/tashanzhishi/p/10617061.html