JDK1.8 LinkedList 源码解析

举报
tanoak 发表于 2018/12/20 10:47:31 2018/12/20
【摘要】 JDK1.8 LinkedList 源码解析

1. UML类图


9819800-ff02ffa2e7521886.jpg

2.  LinkedList的底层实现是基于双向链表

   a. LinkedList 实现 List 接口,能对它进行队列操作

   b. LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用


以下代码是抽取JDK中LinkedList的源码简化版,便于理解


```

package com.tanoak.jdk.linkedlist;


import java.io.Serializable;

import java.util.NoSuchElementException;


/**

 * @author tanoak@qq.com

 * @date 2018/8/23 0:29

 * @Desc

 */

public class TkSingleLinkedList<E>  implements Serializable {

    /**

     * transient 反序列化

     *

     */

     

    /**

     * 修改次数

     */

    

    protected transient int modCount = 0;

    /**

     * 集合大小

     */

    transient int size = 0;

    

    /**

     * Pointer to first node.

     * 首节点

     */

    transient Node<E> first;

    

    /**

     * 尾节点

     */

    transient Node<E> last;

    

    /**

    * 私有静态内部类

    *

    */

    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;

        }

    }

    /**

     * Constructs an empty list.

     */

    public TkSingleLinkedList() {

    }

    

    /**

     * 将一个元素添加至list尾部

     * @param e 泛型

     * @return

     */

    public boolean add(E e) {

        linkLast(e);

        return true;

    }

 

    /**

     * Links e as last element.

     * @param 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++;

    }

    

    /**

     * Returns the (non-null) Node at the specified element index.

     */

    private Node<E> node(int index) {

        // assert isElementIndex(index);

        if (index < (size >> 1)) {

            Node<E> x = first;

            for (int i = 0; i < index; i++){

                x = x.next;

            }

            return x;

        } else {

            Node<E> x = last;

            for (int i = size - 1; i > index; i--){

                x = x.prev;

            }

            return x;

        }

    }

    

    /**

     * 根据下标获值

     *  @param index

     * @return

     */

    public E get(int index) {

        checkElementIndex(index);

        return node(index).item;

    }

    

    /**

     * 检查下标是否越界

     * @param index

     */

    private void checkElementIndex(int index) {

        if (!isElementIndex(index)){

            throw new IndexOutOfBoundsException("下标越界");

        }

    }

    /**

     * 判断参数是否有对应索引.

     */

    private boolean isElementIndex(int index) {

        return index >= 0 && index < size;

    }

    

    /**

     *根据下标删除

     * @param index

     * @return

     */

    public E remove(int index) {

        checkElementIndex(index);

        return unlink(node(index));

    }

    

    /**

     *  删除第一个匹配的指定元素

     * @param o

     * @return

     */

    public boolean remove(Object o) {

        if (o == null) {

            for (Node<E> x = first; x != null; x = x.next) {

                if (x.item == null) {

                    unlink(x);

                    return true;

                }

            }

        } else {

            for (Node<E> x = first; x != null; x = x.next) {

                if (o.equals(x.item)) {

                    unlink(x);

                    return true;

                }

            }

        }

        return false;

    }

    /**

     * Unlinks non-null node x.

     */

    E unlink(Node<E> x) {

        // assert x != null;

        final E element = x.item;

        final Node<E> next = x.next;

        final Node<E> prev = x.prev;

        

        if (prev == null) {

            first = next;

        } else {

            prev.next = next;

            x.prev = null;

        }

        if (next == null) {

            last = prev;

        } else {

            next.prev = prev;

            x.next = null;

        }

        

        x.item = null;

        size--;

        modCount++;

        return element;

    }

    /**

     * 集合大小

     * @return 集合当前容量

     */

    public int size() {

        return size;

    }

    

    /**

     * 无参 删除节点

     * @return

     */

    public E remove() {

        //调用删除第一个节点的方法

        return removeFirst();

    }

    

    /**

     * 删除第一个节点

     * @return

     */

    public E removeFirst() {

        final Node<E> f = first;

        if (f == null)

            throw new NoSuchElementException();

        return unlinkFirst(f);

    }

    

    /**

     * 删除第一个节点

     * 实际执行的方法

     */

    private E unlinkFirst(Node<E> f) {

        // assert f == first && f != null;

        final E element = f.item;

        final Node<E> next = f.next;

        f.item = null;

        f.next = null; 

        first = next;

        if (next == null)

            last = null;

        else

            next.prev = null;

        size--;

        modCount++;

        return element;

    }

}

```

LinkedList的源码相对比较简单,对于方法的解读在代码中有注释。


如理解有误,请指正


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。