Java还要再学一遍基础(七)LinkedList详解

来源:互联网 发布:知而不争 不可谓忠翻译 编辑:程序博客网 时间:2024/04/27 22:29

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接口,因此不能随机访问。

  1. 重要属性
//元素的个数,不能序列化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 
阅读全文
0 0
原创粉丝点击