今天看了一下LinkedList的源代码, 它的实现是通过操作一个静态的内部类的对象来实现的
private static class Entry<E> {
E element;
Entry<E> next;
Entry<E> previous;
Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
}
静态的内部类,在内存中,是一个相对独立的存储单元
通过指针的方式,把内存中分散的对象,连接成一个有前后顺序的结构。
再通过外部的方法,对这个对象结构做操作,例如删除
private E remove(Entry<E> e) {
if (e == header)
throw new NoSuchElementException();
E result = e.element;
e.previous.next = e.next;
e.next.previous = e.previous;
e.next = e.previous = null;
e.element = null;
size--;
modCount++;
return result;
}
只是在查询LinkedList中某个元素时,是从header开始,逐个元素遍历的
private Entry<E> entry(int index) {
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException("Index: "+index+
", Size: "+size);
Entry<E> e = header;
if (index < (size >> 1)) {
for (int i = 0; i <= index; i++)
e = e.next;
} else {
for (int i = size; i > index; i--)
e = e.previous;
}
return e;
}
只是这样性能相对较低!
难怪Kent Beck提到LinkedList的增加和删除的性能要优于由对象数组实现的ArrayList。