LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,而随机访问和遍历的速度则较慢。另外,它还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
链表LinkedList
由于ArrayList是用数组实现的,所以 get(int index) 和 set(int index, E e) 方法可以通过下标访问和修改元素,也可以用 add(E e) 方法在线性表末尾添加元素,它们是高效的。但是 add(int index, E e) 和 remove(int index) 方法的效率很低,因为需要移动潜在的大量元素。
为了提高在表中开始位置添加和删除元素的效率,可以采用链式结构来实现线性表。
节点
每个节点都包含元素和一个名为next的数据域,next指向下一个元素。如果节点是线性表中的最后一个,那么它的指针数据域next所包含的值是null。
1 | // This class is only used in LinkedList, so it is private. |
实现addFirst(E e)方法
1 | public void addFirst(E e) { |
实现addLast(E e)方法
1 | public void addLast(E e) { |
实现add(int index, E e)方法
1 | public void add(int index, E e) { |
实现removeFirst()方法
1 | public E removeFirst() { |
实现removeLast()方法
1 | public E removeLast() { |
实现remove(int index)方法
1 | public E remove(int index) { |
MyLinkedList具体实现
1 |
|
抽象类和接口
MyList接口
1 | public interface MyList<E> extends Iterable<E> { |
MyAbstractList抽象类
1 | public abstract class MyAbstractList<E> implements MyList<E> { |