说起LinkedList
我们先说说他的底层实现,LinkedList
底层实现使用的双向链表,方便于数据的增加和删除,在对数据进行查询时是非常不方便的,需要一个一个的变量非常影响效率,所以在大量进行增删操作时可以使用LinkedList
。
add方法
在说add
方法之前我们先看一个Node
结点类(内部类),以免后面不知道Node
是什么:
private static class Node<E> {
//存储当前结点的数据
E item;
//记录下一个结点的指针
Node<E> next;
//记录上一个结点的指针
Node<E> prev;
//带参构造器
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
开始正题:
//链表长度
transient int size = 0;
//指向上一个结点的指针(临时变量暂存)
transient Node<E> first;
//指向下一个结点的指针(临时变量暂存)
transient Node<E> last;
public boolean add(E e) {
linkLast(e);
return true;
}
在我们调用linkedlist
的add
方法时,在方法体中首先调用的是linklast
方法:
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++;
}
当添加第一个元素时,last
为null
,执行final Node<E> l = last
后,l
也为null
,实例化一个node
结点newNode
,参数为头指针为l(null)
数据e
,尾指针null
,再执行last = newNode
,将这个newNode
对象赋值给临时变量last
,判断l
是否为null
,判断成立,将这个结点记做为头结点赋值到临时变量first
中。
添加第二个元素时,last
为上个结点地址,执行final Node<E> l = last
后,l
也为上一个结点的地址,实例化一个node
结点newNode
,参数为头指针为l(上个结点的地址)
数据e
,尾指针null
,再执行last = newNode
,将新的(第二个)newNode
对象赋值给临时变量last
,判断l
是否为null
,判断不成立,执行l.next = newNode;
头结点的下一个即第一个结点的尾结点等当前结点地址,从这开始已经形成了一个双向的链表,再添加新的元素操作一样。
为了方便理解简单画了个图,如下图:
以上博文都是个人理解,如有不对请留言,大家共同学习!