Java LinkedList
考点:
什么是LinkedList?
不仅是Java的一个类,还是一个数据结构
是经典的双向链表实现:prev/next指针
也是Java中最常用的Deque(双端队列)实现
核心数据结构?
双向链表
查找/插入/删除复杂度?
查找:O(n) (需要一个一个找,有优化,判断下标在前半部分就从前面开始找,在后半部分就在后面开始找)
查找+插入/删除:O(n) (要删除非头尾某个位置的元素要先找到它才能删除)
头尾插入/删除:O(1) (直接新建或者删除一个节点即可)
和ArrayList区别和联系?
核心数据结构的差别:LinkedList是双向链表,ArrayList是数组
适用场景:
LinkedList: 用在查询比较少而插入删除比较多的情况;比如需要缓存每分钟系统的内存使用情况,那么只需要没每次将最新的数据插入结果中即可,效率极高.
ArrayList: 使用在查询比较多,但是插入和删除比较少的情况;
源码:
add:新建一个节点,然后直接挂上去
get(index):
- 检查index有没有超过容量.
- 拿到该节点,然后获取元素
- 如果index在链表的前半部分就从前面开始循环找
- 如果index在链表的后半部分就从后面开始循环找
add 源码
/**
* Appends the specified element to the end of this list.
* (将指定的元素附加到此列表的末尾。)
* <p>This method is equivalent to {@link #addLast}.
* (此方法等效于addLast 。)
*
* @param e element to be appended to this list 要附加到此列表的元素
* @return {@code true} (as specified by {@link Collection#add})
*/
public boolean add(E e) {
//
linkLast(e);
return true;
}
/**
* Links e as last element.(元素附加到此列表的末尾)
*/
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++;
}
扩展:
transient 关键字,标志字段不被序列化.