LinkedList源码分析笔记(jdk1.8)

1.特点

  LinkedList的底层实现是由一个双向链表实现的,可以从两端作为头节点遍历链表。

  允许元素为null

  线程不安全

  增删相对ArrayList快,改查相对ArrayList慢(curd都会根据index找到Node,折半查找来提高效率)

  底层链表实现,没有扩容一说

2.链表节点

  静态内部类

    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;
        }
    }

3.方法

  add和remove系列的方法,涉及到节点指向的问题,因为是双向链表,所以除了确定元素之外,还需要重置前置节点和后置节点

    1.前置节点和后置节点为null是分别判断

    2.remove,元素的前置节点的next指向当前元素的next;当前元素的后置节点的prev指向当前元素的的prev;置空当前元素一节当前元素的节点指向,等待gc

    3.add默认尾部追加

    4.addAll中定义的中间节点变量,和插入位置的后一个节点 Node<E> pred, succ; ,在for循环中使用 pred = newNode; 步进指向插入的最后一个元素,modCount++;

  get和set方法,都要先获取节点(通过位移运算折半查找,提升查询效率)

     Node<E> node(int index) 

  ArrayList和LinkedList都有一个内部类ListItr,实现了ListIterator接口

    可以使用listIterator进行迭代循环

  LinkedList比较简单主要是数据结构双向列表的指向问题,画图很好理解

posted @ 2018-11-26 18:05  灬小乙  阅读(146)  评论(0编辑  收藏  举报