集合之LinkedList(含JDK1.8源码分析)

LinkedList的数据结构

LinkedList的增删改查

增:add

  说明:add函数用于向LinkedList中添加一个元素,并且添加到链表尾部。具体添加到尾部的逻辑是由linkLast函数完成的。

举例:

public class Test {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("zhangsan");
        list.add("lisi");
        list.add("wangwu");
     
list.add("zhangsan");
     System.out.println(list);
  }
}

结果:

[zhangsan, lisi, wangwu, zhangsan]

add源码分析:

/**
     * Appends the specified element to the end of this list.
     *
     * <p>This method is equivalent to {@link #addLast}.
     *
     * @param e element to be appended to this list
     * @return {@code true} (as specified by {@link Collection#add})
     */
    public boolean add(E e) {
        linkLast(e);
        return true;
    }

LinkLast方法如下:

/**
     * Links e as last element.
     */
    void linkLast(E e) {
        //将last节点保存
        final Node<E> l = last;
        //构造新节点
        final Node<E> newNode = new Node<>(l, e, null);
        //将新构造的节点赋值给last节点,便于下次添加元素时使用
        last = newNode;
        //判断保存的last节点是否为null
        if (l == null)
            //为null,首次添加,first节点与last节点一样,都是新节点
            first = newNode;
        else
            //不为null,说明list中已有元素,将newNode赋值给未添加元素e之前,list中已经存在的last节点的next属性
            l.next = newNode;
        //size加1
        size++;
        //结构性修改加1
        modCount++;
    }

图示说明添加元素后链表状态的改变:

list.add("zhangsan");

list.add("lisi");

list.add("wangwu");

由此可见,双向链表的含义即:由上一个节点的next属性可以得到下一个节点,下一个节点的prev属性可以得到上一个节点。上下两个节点之间互相指向关联。

猜你喜欢

转载自www.cnblogs.com/zfyang2429/p/10361250.html