一,前言
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作为队列和栈的实现。