java集合: LinkedList源码浅析
LinkedList 数据结构是双向链表,插入删除比较方便。
LinkedList 是线程不安全的,允许元素为null  。
构造函数:
构造函数是空的。
/**
* Constructs an empty list.
*/
public LinkedList() {
}
基本属性:
    //transient表示不会被序列化
   //集合元素数量
    transient int size = 0;
    //链表头节点
    transient Node<E> first;
    //链表尾节点
    transient Node<E> last;
链表节点: Node<E>
链表节点通过内部类Node<E>表示,这是一个双向链表。
既可以从头开始遍历,也可以从尾开始遍历。
next是上一个节点,prev是下一个节点。
 private static class Node<E> {
         //链表存储的元素
        E item;
        //next表示下一个节点
        Node<E> next;
        //prev表示上一个节点
        Node<E> prev;
        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }
添加元素: 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) {
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++;
}
查询链表: get(index)
使用get(int index)。如下:
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
//检查下标,如果越界就抛异常
checkElementIndex(index);
//遍历双向链表返回结果
return node(index).item;
} private void checkElementIndex(int index) {
if (!isElementIndex(index))
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
} /**
* Tells if the argument is the index of an existing element.
*/
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
}
遍历链表: node(index)
在用get(index)查询元素时调用了node(index)方法来遍历。
如果下标小于链表长度的一半,就从头遍历。反之就从尾遍历。这样查找的效率比较高。
/**
* Returns the (non-null) Node at the specified element index.
*/
Node<E> node(int index) {
// assert isElementIndex(index);
// size右移1位,表示size的一半。
//如果下标小于链表长度的一半,就从头开始遍历。
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;
}
}
参考博客 :
https://blog.csdn.net/zxt0601/article/details/77341098
java集合: LinkedList源码浅析的更多相关文章
- Java集合---LinkedList源码解析
		
一.源码解析1. LinkedList类定义2.LinkedList数据结构原理3.私有属性4.构造方法5.元素添加add()及原理6.删除数据remove()7.数据获取get()8.数据复制clo ...
 - Java集合——LinkedList源码详解
		
)LinkedList直接继承于AbstractSequentialList,同时实现了List接口,也实现了Deque接口. AbstractSequentialList为顺序访问的数据存储结构提供 ...
 - Java集合-LinkedList源码分析
		
目录 1.数据结构-链表 2.ArrayList结构特性 3.构造方法 4.成员变量 5.常用的成员方法 6.Node节点 7.序列化原理 8.迭代器 9.总结 1.数据结构-链表 链表(Linked ...
 - 【java集合框架源码剖析系列】java源码剖析之LinkedList
		
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 在实际项目中LinkedList也是使用频率非常高的一种集合,本博客将从源码角度带领大家学习关于LinkedList的知识. ...
 - 【java集合框架源码剖析系列】java源码剖析之ArrayList
		
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 本博客将从源码角度带领大家学习关于ArrayList的知识. 一ArrayList类的定义: public class Arr ...
 - 自己根据java的LinkedList源码编写的一个简单的LinkedList实现
		
自己实现了一个简单的LinkedList /** * Create by andy on 2018-07-03 11:44 * 根据 {@link java.util.LinkedList}源码 写了 ...
 - 【java集合框架源码剖析系列】java源码剖析之TreeSet
		
本博客将从源码的角度带领大家学习TreeSet相关的知识. 一TreeSet类的定义: public class TreeSet<E> extends AbstractSet<E&g ...
 - 【java集合框架源码剖析系列】java源码剖析之HashSet
		
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于HashSet的知识. 一HashSet的定义: public class HashSet&l ...
 - 【java集合框架源码剖析系列】java源码剖析之TreeMap
		
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于TreeMap的知识. 一TreeMap的定义: public class TreeMap&l ...
 - 【java集合框架源码剖析系列】java源码剖析之HashMap
		
前言:之所以打算写java集合框架源码剖析系列博客是因为自己反思了一下阿里内推一面的失败(估计没过,因为写此博客已距阿里巴巴一面一个星期),当时面试完之后感觉自己回答的挺好的,而且据面试官最后说的这几 ...
 
随机推荐
- 使用include重用布局
			
尽管Android 支持各种小部件,来提供小且可以重用的交互元素,你可能还需要更大的,要求一个专门布局的重用组件.为了高效的重用整个布局,你能使用和标签在当前的布局中嵌入别的布局. 重用布局功能特别强 ...
 - 转载:明明白白VC LIB和DLL的使用
			
转载来自:http://dpinglee.blog.163.com/blog/static/1440977532016316813889/ 1.加载lib/头文件 分两种方法: (1)适用于当前项目 ...
 - canal 入门(基于docker)
			
第一步:安装MySQL:(可以参考:https://my.oschina.net/amhuman/blog/1941540) 命令: sudo docker run -it -d --restart ...
 - RestTemplate的异步使用
			
参考:https://blog.csdn.net/yezhuanxu/article/details/53643248 支持异步调用AsyncRestTemplate @RequestMapping( ...
 - template.js 数据渲染引擎
			
template.js 数据渲染引擎 template.js是一款JavaScript模板引擎,用来渲染页面的. 原理:提前将Html代码放进编写模板 <script id="tpl& ...
 - 20165304 实验二 Java面向对象程序设计
			
一.面向对象程序设计1--单元测试和TDD 实验要求 1.参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习 2 ...
 - TFrame bug
			
delphi 10.1.2 工程里有很多fram 正确的工程文件dproj中fram的定义是 <DCCReference Include="Unit15frame.pas"& ...
 - delphi 控制音量 静音的类
			
delphi 控制音量 静音的类 unit ttSound; interface uses winapi.windows, winapi.Messages; type SimpleSoundContr ...
 - day3  python    阿狸的进阶之路
			
函数概念: 1.为什要有函数 组织结构不清晰,可读性差,代码冗余,可扩展性差. 2.什么是函数 具备某一个功能的工具--->函数 事先准备工具->函数的定义 拿来就用. ...
 - jqGrid基本使用
			
jqGrid: 参照网址:官网地址http://www.trirand.com/ http://blog.mn886.net/jqGrid/(快速获取demo) http://www.guriddo. ...