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

/**

* Constructs a new empty instance of {@code LinkedList}.

*/

public LinkedList() {

voidLink = new Link(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 oldLast = voidLink.previous;

Link newLink = new Link(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 {

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 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 previous = link.previous;

Link next = link.next;

previous.next = next;

next.previous = previous;

size--;

modCount++;

return link.data;

}

throw new IndexOutOfBoundsException();

}移除数据相对比较简单:

1.定位移除节点的位置

2.上一节点的next 设值

3.下一节点的previous 设值

相关的方法: removeFirstImpl,removeLastImpl

其中里面有一个关键字:

linkedlist java 实现_Java LinkedList 实现原理相关推荐

  1. Java LinkedList – Java中的LinkedList

    Java LinkedList is an implementation of the List and Deque interfaces. It is one of the frequently u ...

  2. java 笛卡尔积_Java笛卡尔积算法原理与实现方法详解

    本文实例讲述了Java笛卡尔积算法原理与实现方法.分享给大家供大家参考,具体如下: 笛卡尔积算法的Java实现: (1)循环内,每次只有一列向下移一个单元格,就是CounterIndex指向的那列. ...

  3. python内嵌函数和闭包与java 匿名内部类_Java匿名内部类构造原理分析

    很明显,我们的匿名内部类有了名字 InnerTest$1,而且是继承自 Test class InnerTest$1 extends Test 这个类中有一个成员final InnerTest thi ...

  4. java看山不是山_java线程启动原理分析

    一.前言 不知道哪位古人说:人生三大境界.第一境界是:看山是山看水是水:第二境界是看山不是山看水不是水:第三境界:看山还是山看水还是水. 其实我想对于任何一门技术的学习都是这样. 形而上下者为之器,形 ...

  5. java 双向链表_java集合类之LinkedList

    LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. LinkedList 实现 List ...

  6. LIST函数JAVA特点_Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和性能分析)...

    java 集合系列目录: 第1部分 List概括 先回顾一下List的框架图 (01) List 是一个接口,它继承于Collection的接口.它代表着有序的队列. (02) AbstractLis ...

  7. java linkedlist用法_Java linkedList详细介绍及使用示例

    ①LinkedList简单介绍 是一个继承于AbstractSequentialList的双向链表.它可以被当成堆栈.队列或双端队列进行操作. 实现了List接口,能对它进行队列操作. 实现了Dequ ...

  8. java linkedlist 方法_Java LinkedList getFirst()方法与示例

    LinkedList getFirst()方法 (LinkedList getFirst() method) This method is available in package java.util ...

  9. java list 线程安全_java linkedlist线程安全吗?是线程安全的吗?

    你知道linkedlist是否是线程安全的吗?下面的文章内容,要给大家介绍的就是这个方面的问题,一起来详细的了解一下吧. 在java当中,linkedlist是线程不安全的. 延伸阅读: 在多线程当中 ...

最新文章

  1. Anti-dump的原理
  2. 【中级软考】MTBF是什么?(平均故障间隔时间,Mean Time Between Failure,是衡量一个产品的可靠性指标,单位为小时)
  3. Struts2 表单和非表单标签
  4. 集合、深浅拷贝、文件操作(读、写、追加)函数初识(参数)
  5. Javascript设计模式(四)-- 建造者模式
  6. mysql主库从库在同一台服务器_mysql数据库从一台服务器迁移到另一台服务器上...
  7. phalcon index.php,除了Phalcon php中的indexAction之外,无法调用indexController的动作
  8. web项目调用qq临时会话功能实现方法
  9. Excel 截取字符串函数
  10. jetson nano 电源_Jetson Nano必读-第二站:电源
  11. flutter 收起软键盘
  12. CF 375C Circling Round Treasures [DP(spfa) 状压 射线法]
  13. 【UEditor】百度UE富文本自定义按钮添加文本
  14. python时间序列分析2-平稳时间序列分析
  15. PCI Express架构概述
  16. MIT,Apache 等协议如何理解?
  17. 南瑞rt21系统服务器,RT21-SCADA在轨道交通电力监控系统中应用
  18. HDU 4291 A Short problem
  19. ai人工智能培训讲师计算机视觉讲师叶梓:计算机视觉领域的自监督学习模型——MAE-8
  20. 【3/101】小朱的101次面试之自动化测试工程师

热门文章

  1. netty系列之:轻轻松松搭个支持中文的服务器
  2. 关于Storm Tick
  3. 揪出XXL-JOB中的细节
  4. JAVA虚拟机运行数据区
  5. zookeeper的ZAB协议学习
  6. 数据结构(5) -- 图
  7. 【最详细解析】1070 结绳 (25分)_18行代码AC
  8. 代码分析+原理图解——棋盘覆盖问题-分治法
  9. GC算法以及垃圾回收器
  10. LinkedList方法源码