Java LinkedList 实现原理

原创 2016年08月31日 16:19:09

LinkedList 大家都不陌生,来看看他的实现原理,首先声明,他是一个双链条,即previous,next 

   /**
     * Constructs a new empty instance of {@code LinkedList}.
     */
    public LinkedList() {
        voidLink = new Link<E>(null, null, null);
        voidLink.previous = voidLink;
        voidLink.next = voidLink;
    }
默认无参构造方法中,新建了一个空节点,他的previous,next都 指向他自己。另外一个构造方法:

   /**
     * Constructs a new instance of {@code LinkedList} that holds all of the
     * elements contained in the specified {@code collection}. The order of the
     * elements in this new {@code LinkedList} will be determined by the
     * iteration order of {@code collection}.
     *
     * @param collection
     *            the collection of elements to add.
     */
    public LinkedList(Collection<? extends E> collection) {
        this();
        addAll(collection);
    }
默认添加节点的位置是在最后:

/**
     * Adds the specified object at the end of this {@code LinkedList}.
     *
     * @param object
     *            the object to add.
     * @return always true
     */
    @Override
    public boolean add(E object) {
        return addLastImpl(object);
    }

    private boolean addLastImpl(E object) {
        Link<E> oldLast = voidLink.previous;
        Link<E> newLink = new Link<E>(object, oldLast, voidLink);
        voidLink.previous = newLink;
        oldLast.next = newLink;
        size++;
        modCount++;
        return true;
    }
其中链条的设置顺序为:

1.先设置新添加的节点的previous,next

2.然后设置老节点的next,和空节点的previous,完成节点链条的设置值。

3.总大小自增,修改次数自增

属性modCount的作用在于:
private class SimpleListIterator implements Iterator<E> {
        int pos = -1;

        int expectedModCount;

        int lastPosition = -1;

        SimpleListIterator() {
            expectedModCount = modCount;
        }

        public boolean hasNext() {
            return pos + 1 < size();
        }

        public E next() {
            if (expectedModCount == modCount) {
                try {
                    E result = get(pos + 1);
                    lastPosition = ++pos;
                    return result;
                } catch (IndexOutOfBoundsException e) {
                    throw new NoSuchElementException();
                }
            }
            throw new ConcurrentModificationException();
        }

        public void remove() {
            if (this.lastPosition == -1) {
                throw new IllegalStateException();
            }

            if (expectedModCount != modCount) {
                throw new ConcurrentModificationException();
            }

            try {
                AbstractList.this.remove(lastPosition);
            } catch (IndexOutOfBoundsException e) {
                throw new ConcurrentModificationException();
            }

            expectedModCount = modCount;
            if (pos == lastPosition) {
                pos--;
            }
            lastPosition = -1;
        }
    }
当你在遍历整个list列表数据时,如果异步线程修改了这个列表的数据时,这个list遍历过程能够及时的抛错并退出当前的遍历,可以很好的保护数据读取的一致性。
如果我们要移除一部分数据时:

    /**
     * Removes the object at the specified location from this {@code LinkedList}.
     *
     * @param location
     *            the index of the object to remove
     * @return the removed object
     * @throws IndexOutOfBoundsException
     *             if {@code location < 0 || location >= size()}
     */
    @Override
    public E remove(int location) {
        if (location >= 0 && location < size) {
            Link<E> link = voidLink;
            if (location < (size / 2)) {
                for (int i = 0; i <= location; i++) {
                    link = link.next;
                }
            } else {
                for (int i = size; i > location; i--) {
                    link = link.previous;
                }
            }
            Link<E> previous = link.previous;
            Link<E> next = link.next;
            previous.next = next;
            next.previous = previous;
            size--;
            modCount++;
            return link.data;
        }
        throw new IndexOutOfBoundsException();
    }
移除数据相对比较简单:

1.定位移除节点的位置

2.上一节点的next 设值

3.下一节点的previous 设值
相关的方法: removeFirstImpl,removeLastImpl

其中里面有一个关键字:transient


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Java LinkedList 实现原理

LinkedList 大家都不陌生,来看看他的实现原理,首先声明,他是一个双链条,即previous,next  /** * Constructs a new empty insta...

深入Java集合学习系列:LinkedList的实现原理

1. LinkedList概述:   List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

【JAVA笔记】Linkedlist的实现原理

待补充

java LinkedList实现原理概述

一、LinkedList实现原理概述 LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同。LinkedList 是基于链表实现的(通过名...

LinkedLIst的实现原理

1、实现方式   LinkedLIst是基于双向链表实现的 ,所谓的双向链表就是集合中每个元素对象都知道其前一个对象和后一个对象的位置。在LinkedList中,是以一个内部的Entry对象来代...

Java LinkedList的实现原理详解

LinkedList是Java List类型的集合类的一种实现,此外,LinkedList还实现了Deque接口。本文基于Java1.8,对于LinkedList的实现原理做一下详细讲解。 (Java...

java linkedlist 原理

linkedlist原理分析的过程,主要是从下面几个方面进行 1、类的继承关系public class LinkedList extends AbstractSequentialList ...

normalization的实现原理

我是在FaceNet的论文中看到这个东西的。 那么在其具体的实现原理是怎么样的呢? 归一化,的方式有很多,在那篇论文中,相当于做的是希望:每个点都映射到一个球面上。也就是希望: 为了达到这个目的...

MVC简单的工作原理

先解释各个含义: M 代表 Model,即模型,用于封装与业务逻辑有关的代码和数据。例如订单模型、商品模型分别封装订单和商品的数据和业务逻辑。 V 代表 View,即视图,用于呈现内容给用户(也就是...

Java源代码阅读——ArrayList实现原理

一  概述 public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)