LinkedList源码分析(基于Jdk 11.0.2)
LinkedList和ArrayList都是实现了List接口,这两个类也经常拿来作比较。
总体来讲,它们有以下不同:
- 1,ArrayList底层是数组,LinkedList底层是双向链表
- 2,ArrayList由于底层是数组,所以查找和修改元素快,因为它可以直接操作角标,但是增加、删除操作就慢些,因为要移动大量元素;LinkedList则恰恰相反,因为是用指针指向下一个元素,所以增删只要修改指针的指向就可以达到,而且只需要修改一个,但是LinkedList查找和修改就效率低一些,因为要定位到元素,对于LinkedList来说会慢一些(不想数组一样有下标可以直接操作)
- 3,LinkedList和ArrayList都不是线程安全的
1 | public LinkedList() { |
构造函数没做什么。
Node节点:1
2
3
4
5
6
7
8
9
10
11
12private 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;
}
}
可以看出它是双向链表。
1,增加元素
1 | //addAll ,在尾部批量增加 |
1 | //以index为插入下标,插入集合c中所有元素 |
1 | //检查index是否越界(0,size) |
1 | //如果没有越界返回true |
插入单个节点
1 | //在尾部插入一个节点: add |
1 | //生成新节点 并插入到 链表尾部, 更新 last/first 节点 |
删除节点
1 | public E remove(int index) { |
1 | E unlink(Node<E> x) { |
##