打破舒适圈,经常对 Java 知识进行总结思考,才能保证自己不掉队。
系统化重学 Java 第二篇,来一起分析下 Java 集合中的常见疑问点吧。
第一问: 为什么 Java 1.7 中,LinkedList 底层不再使用循环链表?
在JDK 1.7 前(比如 JDK1.6),LinkedList 底层采用的是 headerEntry 实现的一个循环链表。
也就是先初始化一个空的 Entry,用来做 header,然后首尾相连,形成循环链表,如下图所示:
每次添加/删除元素都是默认在链尾操作,也就是在 header 前面操作,因为遍历是 next 方向的,所以在 header 前面操作,就相当于在链表尾操作。
对应代码如下:
//取自 JDK1.6 - LinkedList,有删改
private Entry<E> addBefore(Eo) {
Entry<E>newEntry = new Entry<E>(o,header,header.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}
而在 JDK 1.7, JDK 1.6 的 headerEntry 循环链表被替换成了 firstEntry 和 lastEntry 组成的非循环链表。
添加一个元素的代码如下:
//取自 JDK1.7 - LinkedList,有删改
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode =new Node<>(l, e,null);
last = newNode;
if (