LinkedList集合底层原理
LinkedList定义在Java.util包下
- 底层数据结构是双链表,查询慢,增删快,但是如果操作的是首尾元素,速度也是极快的
- LinkedList本身多了很多直接操作首位元素的特有API
| 特有方法 | 说明 |
|---|---|
| public void addFirst(E e) | 在该列表开头插入指定元素 |
| public void addLast(E e) | 将指定的元素追加到从列表的末尾 |
| public E getFirst() | 返回此列表中的第一个元素 |
| public E getLast() | 返回此列表中的最后一个元素 |
| public E removeFirst() | 从此列表中删除并返回第一个元素 |
| public E removeLast() | 从此列表中删除并返回最后一个元素 |
- LinkedList中定义了一个静态内部类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;
}
}
- LinkedList中已经定义好的成员变量
- 值得注意的是头节点first和尾结点last是一个空结点,结点本身存储的是null
transient int size = 0; //集合的长度/结点的总个数
transient Node<E> first; //头结点
transient Node<E> last; //尾结点
- 空参构造
public LinkedList() {
}
- add方法
public boolean add(E e) {
linkLast(e); //底层调用linkLast方法
return true;
}
//linkLast方法:创建结点,并把结点添加到链表中
void linkLast(E e) {
final Node<E> l = last; //将last记录的地址值分享给l,使得l和last都能找到这个结点
//创建新的结点newNode,传入的参数分别为
//上一个节点的地址:尾结点的地址
//要添加的元素:e
//下一个结点的地址:空null
final Node<E> newNode = new Node(l, e, null); //这个结点数据的地址值被newNode所记录
//将newNode记录的地址值分享给尾结点,尾结点原来记录的地址值被覆盖
//这时原来last所记录的结点只有l能记录
last = newNode;
if (1 == null) { //如果last之前没有记录结点,那么这就是一个空链表
first = newNode; //将newNode记录的地址值分享给first
} else {
l.next = newNode; //将newNode记录的地址值分享给l.next
}
size++;
modCound++;
}