List-LinkedList源码分析
第一步:LinkedList初始化。
LinkedList linkedList = new LinkedList();
第二步:LinkedList中源码中的属性分析(大概)
transient int size;
transient LinkedList.Node<E> first;
transient LinkedList.Node<E> last;
// 我们可以看到,我们链表维护了一个size(链表的长度)、first(头)节点 和last(尾)节点
// first 可以作为整个链表的第一个元素,也就是头元素
// last 作为整个链表的最后一个元素。
第三步:Node分析
// 静态内部类,创建一个Node
private static class Node<E> {
// E可以解释为Objec类型
E item; //添加的数据
LinkedList.Node<E> next;
LinkedList.Node<E> prev;
有参构造
Node(LinkedList.Node<E> var1, E var2, LinkedList.Node<E> var3) {
this.item = var2;
this.next = var3;
this.prev = var1;
/*,
在Node的结构中有个(item)属性、一个(next)节点、一个(prev)节点,
以此证明了可以通过一个节点找到它的前一个节点,以及后一个节点,
也就实现了双向绑定的效果,或者称其为 “双向链表”。*/
}
第四步:add方法,通过add方法可以大概了解一下LinkedList为什么称之为双向链表的原因
public boolean add(E var1) {
this.linkLast(var1);
return true;
}//当我们查看LinkedList中add元素时,我们看到了add方法中调用了linkLast方法,点进去看一下
第五步:add方法中的linkLast方法
void linkLast(E var1) { // 传入一个对象类型的参数
LinkedList.Node var2 = this.last;
// 将last赋给 var2
LinkedList.Node var3 = new LinkedList.Node(var2, var1, (LinkedList.Node)null);
//将newNode的prev节点指向last,后节点指向null,因为创建的newNode永远都是作为last节点的,
也就是链表的最后一个元素,所以next节点指向null
this.last = var3;
//last节点指向newNode也就是var3
//如果链表的last节点为null的话则first节点将会指向var3,也就是新的节点,此时链表只有一个节点first和last都指向唯一的一个节点var3。
//如果链表的last不为null,只需要将last节点的next指向这个var3节点就行了。
if (var2 == null) {
this.first = var3;
} else {
var2.next = var3;
}
++this.size;
//链表的长度+1;
++this.modCount;
}
总结:
**LinkedlList底层存储所使用的数据结构是链表而不是ArrayList中的数组,数组和链表是数据结构中的两个基本存储结构。 **