Java LinkedList集合底层原理

143 阅读2分钟

LinkedList集合底层原理

LinkedList定义在Java.util包下

  • 底层数据结构是双链表,查询慢,增删快,但是如果操作的是首尾元素,速度也是极快的
  • LinkedList本身多了很多直接操作首位元素的特有API
特有方法说明
public void addFirst(E e)在该列表开头插入指定元素
public void addLast(E e)将指定的元素追加到从列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表中的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素
  • LinkedList中定义了一个静态内部类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;
    }
}
  • LinkedList中已经定义好的成员变量
    • 值得注意的是头节点first和尾结点last是一个空结点,结点本身存储的是null
transient int size = 0;  //集合的长度/结点的总个数
transient Node<E> first; //头结点
transient Node<E> last;  //尾结点
  • 空参构造
public LinkedList() {
    
}
  • add方法
public boolean add(E e) {
    linkLast(e);  //底层调用linkLast方法
    return true;
}

//linkLast方法:创建结点,并把结点添加到链表中
void linkLast(E e) {
    final Node<E> l = last;  //将last记录的地址值分享给l,使得l和last都能找到这个结点
    //创建新的结点newNode,传入的参数分别为
    //上一个节点的地址:尾结点的地址
    //要添加的元素:e
    //下一个结点的地址:空null
    final Node<E> newNode = new Node(l, e, null);  //这个结点数据的地址值被newNode所记录
    //将newNode记录的地址值分享给尾结点,尾结点原来记录的地址值被覆盖
    //这时原来last所记录的结点只有l能记录
    last = newNode;
    if (1 == null) {  //如果last之前没有记录结点,那么这就是一个空链表
        first = newNode;  //将newNode记录的地址值分享给first
    } else {
        l.next = newNode;  //将newNode记录的地址值分享给l.next
    }
    size++;
    modCound++;
}