Java List 之 LinkedList(JDK1.8)学习笔记

234 阅读2分钟

Java 集合框架之 List 系列

LinkedList 学习总结 - 基于JDK1.8

ps:所有总结均是个人查看源码手写总结,未借鉴其他博客,转发请标明出处
LinkedList 继承关系图:

上级接口:List, Deque, Cloneable, Serializable
上级抽象类:AbstractSequentialList

LinkedList属性
int size:内部元素实际使用数量
transient Node first:首节点
transient Node last:尾节点
内部类 Node,每个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;
        }
    }

无参构造函数: 内部无操作

传入Collection对象的有参构造函数

public LinkedList(Collection<? extends E> c) {
        this();
        // 主要是调用了addAll方法,接下来又会调用addAll(size, c),将c对象元素插入链表
        addAll(c);
    }
 	

add(E e)方法
会调用linkLast(E e)方法, 默认在链表的尾部插入新元素

void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }

add(int index, E e)方法, 在指定位置添加元素

public void add(int index, E element) {
        // 检查下标是否越界
        checkPositionIndex(index);
		// index等于size,则是在链表的末尾直接插入
        if (index == size)
            linkLast(element);
        else
            // 否则定位到index所在位置进行插入
            // 注意node方法,index小于size一半时从前往后找,否则从后往前找
            linkBefore(element, node(index));
    }

remove()方法

public E remove() {
        // 删除链表的第一个元素
        return removeFirst();
    }

特别之处:由于LinkedList是实现了Deque接口的,所以其本身是可以当队列使用的,内部提供了队列操作的有关方法,例如offer(), poll()等

总结:
LinkedList的底层实现实际是链表,而且是一个双向链表,这就是其与ArrayList最大的区别,同时也是链表与数组的区别,链表在指定位置做插入的效率高于数组,而不具有数组的随机访问特性。同时当需要使用队列时,LinkedList也是一个不错的选择