是一个双链表,在add和remove时比ArrayList性能好,但get和set时就特别慢了。
恶补下:
双向链表,链表的一种。每个数据结点中都有两个指针,分别指向直接前驱和直接后继。因此,我们可以方便的访问他的前驱结点和后继结点。
下图是一个双向链表的图,element为元素,pre指向直接前驱(前一个 元素),next指向直接后继(后一个元素)。而LinkedList还不只是双向链表,他是双向循环链表。也就是第一个pre指针指向最后一个节点,最后一个节点的next指针指向第一个节点,形成一个环路,而不是下图中的Null。
下面来看下代码
public class LinkedList extends AbstractSequentialList implements List, Deque, Cloneable, java.io.Serializable{
//元素个数
transient int size = 0;
//相当于pre指针
transient Node first;
//相当于next指针
transient Node last;
//Node内部类(双链表结构)
private static class Node {
E item;
Node next;
Node prev;
Node(Node prev, E element, Node next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
......
}
Tips:
Deque,他是双端队列的接口,支持在两端插入和移除元素。
public interface Deque extends Queue {}
那么如何进行操作呢?这里以在中间位置添加元素为例。
代码实现如下
//在指定位置添加元素
public void add(int index, E element) {
//检查索引是否有效
checkPositionIndex(index);
//索引值等于集合大小,直接添加在末尾
if (index == size)
linkLast(element);
else
linkBefore(element, node(index));
}
//返回索引处的非空Node
Node node(int index) {
// assert isElementIndex(index);
//如果在链表的前半段
if (index < (size >> 1)) {
Node x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
//后半段
Node x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
//中间插入元素(核心方法!!!!)
void linkBefore(E e, Node succ) {
final Node pred = succ.prev;
final Node newNode = new Node<>(pred, e, succ);
succ.prev = newNode;
if (pred == null)
first = newNode;
else
pred.next = newNode;
size++;
modCount++;
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-82146-3.html