LinkedList介绍
LinkedList与ArrayList一样都是属于AbstractList的子类。但是内部实现与ArrayList不同的是LinkedList是以链表的数据结构来实现的,通过引用来指向上一个或者下一个节点。在数据的插入和删除上面有很高的效率,同时可以被用作队列,栈或者双端队列并提供了对应的操作。
特性:
- 双端队列实现。
- 线程不安全。
- 插入删除效率很高。
- 不能快速随机访问(虽然提供了get等方法,但是使用循环,效率很低下)
##源码分析
1. 类定义
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
继承AbstractSequentialList(AbstractList的子类),同时实现了List借口,Deque接口(双端队列),Cloneable接口。与ArrayList不同的是没有继承RandomAccess接口,因此不能随机访问。
- 重要属性
//元素的个数,不能序列化
transient int size = 0;
//第一个节点,不能序列化
transient Node<E> first;
//最后一个节点,不能序列化
transient Node<E> last;
Node节点的定义类:
private 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;
}
}
其中有两个引用分别指向上一个节点和下一个节点。
3. 重要的方法
方法部分不不做详细描述,都是对链接的修改。
get方法:
public E get(int index) {
checkElementIndex(index);
return node(index).item;
}
Node<E> node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
虽然说不支持快速随机访问,但是还是提供了相应的get方法,用的是暴力循环,但是还是根据index的值与size/2的大小缩小了循环的范围,不过效率还是很差。
4. Iterator
LinkedList的Iterator和ArrayList一样都是有一个Itr实现Iterator接口提供基本的Iterator的功能,同时提供一个ListItr类继承子Itr实现了ListIterator接口,提供更加更富的功能。
但是从JDK1.6开始同时还提供了DescendingIterator继承自Iterator接口。提供一个反向遍历的迭代器:
LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
for(Iterator<Integer> it = list.descendingIterator(); it.hasNext();)
System.out.print(it.next() + " ");
输出:
4 3 2 1