小言_互联网的博客

JDK1.8源码阅读记录LinkedList类

384人阅读  评论(0)

JDK1.8源码阅读记录

JAVA.Util包

LinkedList类

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

LinkedList,是链式列表,底层基于双向链表实现,可以在首尾、或指定索引处操作元素,元素可以重复,可当作栈、队列、双端队列使用。不是线程安全的。可克隆,序列化。
LinkedList适用于频繁在中间位置插入、删除元素的场合。但随机访问速度较慢,需要从头开始逐个找。LinkedList虽然有涉及到索引值,但其索引值的实现是通过遍历取得,并不等于普通数组自带的索引值。
与ArrayList相比,ArrayList基于动态数组,以数组的形式存储,内存是连续的,随机访问速度快,由于每次插入和删除都需要移动数组中的元素,因此不适合于在线性表中间需要频繁进行插入和删除操作。

属性

	transient int size = 0;//LinkedList长度
	transient Node<E> first;//LinkedList首节点
	transient Node<E> last;//LinkedList尾节点

transient表示该类实例在序列化的时候不会考虑这些属性。
在这里,要提示下本类的内部类,表示节点,Node

private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

声明为私有的,明确只有在本外部类才可以使用。

  • item,表示该节点的值或内容
  • next,表示该节点的后一个节点
  • prev,表示该节点的前一个节点

构造方法

	//实例一个空链表
	public LinkedList() {
    }
    
    //将集合c里的元素作为节点,实例链表
    public LinkedList(Collection<? extends E> c) {
        this();
        addAll(c);
    }
    public boolean addAll(Collection<? extends E> c) {
        return addAll(size, c);
    }
    //由于构造函数在使用的时候,size=0,因此这里的index也为0
    public boolean addAll(int index, Collection<? extends E> c) {
        checkPositionIndex(index);

        Object[] a = c.toArray();//以c为源,创建新数组a
        int numNew = a.length;//新数组a的长度
        if (numNew == 0)//空数组,返回false,表示无添加
            return false;

        Node<E> pred, succ;//定义某个节点的前后节点
        if (index == size) {//相当于在链表尾部添加,若链表为空,也相当于在头部添加
            succ = null;//尾部添加,暂不用考虑某节点的后一个节点
            pred = last;//尾部添加,以原链表的最后一个节点作为要添加节点的前个节点
        } else {//非尾部添加
            succ = node(index);//获取指定索引处的节点,作为要添加节点的后个节点
            pred = succ.prev;//指定索引处的节点的前个节点,作为要添加节点的前个节点
        }

        for (Object o : a) {//真正的添加操作
            @SuppressWarnings("unchecked") E e = (E) o;
            Node<E> newNode = new Node<>(pred, e, null);//由对象e(o)创建新节点,顺便链接前节点
            if (pred == null)//相当于头部添加
                first = newNode;//新节点作为头节点
            else
                pred.next = newNode;//通过pred的next链接本新节点
            pred = newNode;//单个节点添加完毕,顺便把pred赋值为本新节点
        }

        if (succ == null) {//表示此前的添加为尾部添加
            last = pred;//指定本链表的尾部节点为最后一个加入本链表的新节点
        } else {//非尾部添加
            pred.next = succ;//由最后一个加入本链表的新节点链接原链表的后部分节点
            succ.prev = pred;//由原链表的后部分节点链接最后一个加入本链表的新节点
        }

        size += numNew;//长度加上这次添加的节点数
        modCount++;//修改次数增1
        return true;//返回true,表示由添加新节点
    }

常用方法

在LinkedList中,有多种节点的增删改操作,但在链表中的增、删、改操作与addAll()方法中执行的真正增加操作思路类似,每次执行完毕后,都要modCount增1。

  • getLast()返回此列表中的最后一个元素(非节点),链表为空会抛出异常
  • getFirst()返回此列表中的第一个元素(非节点),链表为空会抛出异常
  • removeFirst()删除链表的头节点,并返回该节点的元素,链表为空会抛出异常
  • removeLast()删除链表的尾节点,并返回该节点的元素,链表为空会抛出异常
  • addFirst(E e)将指定的元素插入此列表的开头。无返回值。
  • addLast(E e)将指定的元素追加到此列表的末尾。无返回值。
  • contains(Object o)如果此列表包含指定的元素,则返回true。
  • size()返回链表的大小(int值)
  • add(E e)将指定的元素追加到此列表的末尾,增加成功返回true
  • remove(Object o)从此列表中删除第一次出现的指定元素,如果存在,则将其删除。如果此列表不包含元素,则不变。删除成功返回true。
  • clear()从该列表中删除所有元素。 此调用返回后,列表将为空。无返回值。
  • get(int index)返回此列表中指定位置的元素。
  • set(int index, E element)用指定的元素替换此列表中指定位置的元素。返回旧值。
  • add(int index, E element)将指定的元素插入此列表中的指定位置。 将当前在该位置的元素(如果有的话)和任何后继元素向右移动(在其索引处增加一个)。无返回值。
  • remove(int index)删除指定索引值处的元素,并返回该元素。

查找操作方法

  • indexOf(Object o)返回指定元素在此列表中首次出现的索引,如果此列表不包含该元素,则返回-1。
  • lastIndexOf(Object o)返回指定元素在此列表中最后一次出现的索引;如果此列表不包含该元素,则返回-1。

队列操作方法

  • peek()检索但不删除此列表的头(第一个元素)。返回该元素,若链表为空,则返回null。
  • element()检索但不删除此列表的头(第一个元素)。返回该元素,若链表为空,则抛出异常。
  • poll()检索并删除此列表的头(第一个元素)。返回该元素,若链表为空,则返回null。
  • remove()检索并删除此列表的头(第一个元素)。返回该元素,若链表为空,则抛出异常。
  • offer(E e)将指定的元素添加为此列表的尾部(最后一个元素)。增加成功返回true。相当于add(e)
  • offerFirst(E e)将指定的元素插入此列表的前面。增加成功返回true。相当于addFirst(e)
  • offerLast(E e)将指定的元素插入此列表的后面。增加成功返回true。相当于addLast(e)
  • peekFirst()检索但不删除此列表的第一个元素,返回该元素,如果此列表为空,则返回 null。
  • peekLast()检索但不删除此列表的最后一个元素,返回该元素,如果此列表为空,则返回null。
  • pollFirst()检索并删除此列表的第一个元素,返回该元素,如果此列表为空,则返回null。
  • pollLast()检索并删除此列表的最后一个元素,返回该元素,如果此列表为空,则*或返回{null。
  • push(E e)将元素压入此列表表示的堆栈。换句话说,将元素插入此列表的前面。无返回值。
  • pop()从此列表表示的堆栈中弹出一个元素。换句话说,删除并返回此列表的第一个元素。
  • removeFirstOccurrence(Object o)删除首次出现在此列表中的指定元素(从头到尾遍历列表时)。如果列表不包含该元素,则它保持不变。删除成功返回true。
  • removeLastOccurrence(Object o)删除此列表中最后一次出现的指定元素(从头到尾遍历列表时)。如果列表不包含该元素,则它保持不变。删除成功返回true。

迭代器方法

  • listIterator(int index)返回列表中元素的列表迭代器(以适当的顺序),从列表中的指定位置开始。
  • descendingIterator()返回列表中元素的迭代器,操作顺序跟列表迭代器相反。

转载:https://blog.csdn.net/weixin_43459704/article/details/104577385
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场