linkedlist java 实现_Java LinkedList 实现原理
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 实现原理相关推荐
- Java LinkedList – Java中的LinkedList
Java LinkedList is an implementation of the List and Deque interfaces. It is one of the frequently u ...
- java 笛卡尔积_Java笛卡尔积算法原理与实现方法详解
本文实例讲述了Java笛卡尔积算法原理与实现方法.分享给大家供大家参考,具体如下: 笛卡尔积算法的Java实现: (1)循环内,每次只有一列向下移一个单元格,就是CounterIndex指向的那列. ...
- python内嵌函数和闭包与java 匿名内部类_Java匿名内部类构造原理分析
很明显,我们的匿名内部类有了名字 InnerTest$1,而且是继承自 Test class InnerTest$1 extends Test 这个类中有一个成员final InnerTest thi ...
- java看山不是山_java线程启动原理分析
一.前言 不知道哪位古人说:人生三大境界.第一境界是:看山是山看水是水:第二境界是看山不是山看水不是水:第三境界:看山还是山看水还是水. 其实我想对于任何一门技术的学习都是这样. 形而上下者为之器,形 ...
- java 双向链表_java集合类之LinkedList
LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. LinkedList 实现 List ...
- LIST函数JAVA特点_Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和性能分析)...
java 集合系列目录: 第1部分 List概括 先回顾一下List的框架图 (01) List 是一个接口,它继承于Collection的接口.它代表着有序的队列. (02) AbstractLis ...
- java linkedlist用法_Java linkedList详细介绍及使用示例
①LinkedList简单介绍 是一个继承于AbstractSequentialList的双向链表.它可以被当成堆栈.队列或双端队列进行操作. 实现了List接口,能对它进行队列操作. 实现了Dequ ...
- java linkedlist 方法_Java LinkedList getFirst()方法与示例
LinkedList getFirst()方法 (LinkedList getFirst() method) This method is available in package java.util ...
- java list 线程安全_java linkedlist线程安全吗?是线程安全的吗?
你知道linkedlist是否是线程安全的吗?下面的文章内容,要给大家介绍的就是这个方面的问题,一起来详细的了解一下吧. 在java当中,linkedlist是线程不安全的. 延伸阅读: 在多线程当中 ...
最新文章
- Anti-dump的原理
- 【中级软考】MTBF是什么?(平均故障间隔时间,Mean Time Between Failure,是衡量一个产品的可靠性指标,单位为小时)
- Struts2 表单和非表单标签
- 集合、深浅拷贝、文件操作(读、写、追加)函数初识(参数)
- Javascript设计模式(四)-- 建造者模式
- mysql主库从库在同一台服务器_mysql数据库从一台服务器迁移到另一台服务器上...
- phalcon index.php,除了Phalcon php中的indexAction之外,无法调用indexController的动作
- web项目调用qq临时会话功能实现方法
- Excel 截取字符串函数
- jetson nano 电源_Jetson Nano必读-第二站:电源
- flutter 收起软键盘
- CF 375C Circling Round Treasures [DP(spfa) 状压 射线法]
- 【UEditor】百度UE富文本自定义按钮添加文本
- python时间序列分析2-平稳时间序列分析
- PCI Express架构概述
- MIT,Apache 等协议如何理解?
- 南瑞rt21系统服务器,RT21-SCADA在轨道交通电力监控系统中应用
- HDU 4291	 A Short problem
- ai人工智能培训讲师计算机视觉讲师叶梓:计算机视觉领域的自监督学习模型——MAE-8
- 【3/101】小朱的101次面试之自动化测试工程师