java中LinkedList源码分析

ArrayList是动态数组,其实本质就是对数组的操做。
那么LinkedList实现原理和ArrayList是彻底不同的。
如今就来分析一下ArrayList和LinkeList的优劣吧
LinkedList是一个双向链表,每一个元素都是一个Node对象,
这个node对象里面有三个成员:
E item;指向实际的元素
Node<E> next;指向下一个节点
Node<E> prev;指向前一个结点

利用idea编辑器查看LinkedList的结构,发现只有三个成员变量。

而全部的public方法操做的都是这个三个变量。
下面逐个分析方法。

主要就是调用了linkLast方法。

步骤以下:
第一步:l指向尾节点,
第二步:建立新的节点newNode;由于是在链表的最后添加元素,因此新节点的next元素为null.
第三步:尾节点指向新的节点
第四步:若是l(以前的尾节点)为空,新节点看成第一个节点
第五步:若是l(以前的尾节点)不为空,则以前的尾节点的next变量指向新节点。
链表大小size++;
修改的次数modCount++;node

List<String> list=new LinkedList<>();
list.add("a");
list.add("b");

与ArrayList不一样,LinkedList内存是按需分配的,不须要提早分配内存空间,由于操做的不是数组。数组

get方法

checkElementIndex(index);主要用于检查参数是否符合规范,没什么好说的。编辑器

主要看node(index)方法。

index<(size>>1)表示index小于size/2;
若是index索引位于前半部分,从头开始根据next向后遍历;
一直找到index-1索引处
若是在后半部分从last处开始根据prev向前遍历。一直循环到index处。
ArrayList中数组是连续存放的,能够根据索引直接定位元素,而LinkedList中,必须从头或尾顺着连接查找,因此论查询效率LinkedList没有ArrayList效率高;可是在链表前或尾添加和删除的效率却是比ArrayList要高。ide

LinkedList还提供了remove,add(int index,E element),indexOf(Object o)等等这些方法,基本上都是差很少的原理操做的。idea

相关文章
相关标签/搜索