可变的数组-----集合类之LinkList
在上一篇我讲解了ArrayList类的使用方法,和他是如何实现的。在这一篇我会来讲解List接口的另一个实现类:LinkList。则两个类能实现的作用基本一样,但底层实现是完全不同的,这就使在完成某些事情的效率方面各有各的优势。下面我们先来讲解一下他的构造方法。
构造方法
LinkList类中有一个无参的构造方法:
public LinkedList();
他在源码中是这样实现的:
public LinkedList() {
header.next = header.previous = header;
}
在这个方法中用到了一个变量:
private transient Entry<E> header = new Entry<E>(null, null, null);
这里面又提到了一个类:
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;
}
}
这个类中有三个成员变量,其中有两个是用来存储引用的。
下面来说一下Linkedlist类的实现原理。
这个类的内部是用一个双向的循环链表来完成的,在链表中每个元素称为节点,双向的循环链表中的节点由三部分组成:上一个节点的引用,下一个节点的引用,这个节点的实际内容。
他就是通过这个引用来访问上一个或下一个节点,然后再访问下一个的下一个节点,这就是双向的循环链表。我们为了找到第一个节点引入了头结点的概念,头结点中只有上下引用,没有内容,头结点被第一个节点和最后一个节点所指向,他也指向第一个节点和最后一个节点。
在Entry类中element是表示具体内容的,next是用来表示下一个节点的引用,而previous是用来存放上一个节点的引用。这就是LinkedList类的实现原理。
下面我们来讲一下LinkedList类的添加,调用和删除。
集合元素的添加和删除
LinkedList类元素的添加调用了下面这个方法:
public boolean add(E e);
这个方法在内部是这样写的:
public boolean add(E e) {
addBefore(e,header);
return true;
}
又用到了下面这个方法:
private Entry<E> addBefore(Ee, Entry<E> entry) {
Entry<E> newEntry =new Entry<E>(e, entry, entry.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}
这个方法是用来在链表的最后添加元素的,最后一个元素的下一个节点一定是头结点。从这里可以看出他是把要添加元素位置的上一个节点的next内存放了这个节点的地址,在将要添加元素位置的下一个节点的previous内存放这个节点的地址,在使用Entry的这个构造方法是,已经自动把,e的previous指向了上一个节点,next指向了下一个节点。
这就是LinkedList添加的原理。
在任意位置添加是用这个方法:
public void add(int index,E element);
实现原理和上面一样。
删除就是将上一个节点的next指向要删除节点的下一个节点,下一个节点的Previous指向删除节点的上一个节点。具体方法有:
public E remove(int index);
这个方法是在删除指定位置的节点。
LinkedList删除中间元素的代价太大,我们一般是删除最后一个元素或最后一个元素。同理添加也是添加第一个元素或最后一个元素。
用下面这个方法:
public void addFirst(E e);
public void addLast(E e);
public EremoveFirst();
public EremoveLast();
集合元素的调用
由于链表的特性,查找一个元素的位置会浪费大量的程序运行时间,所以不建议大家频繁的使用集合调用的这些方法。
public E get(intindex)
这个方法是用来返回列表指定位置的元素。
当然也有返回第一个和最后一个元素的方法:
public EgetFirst();
public EgetLast();
这两个因为可以通过头结点直接找到,所以不会占用大量的时间,可以大量使用。
关于LinkedList类我就说这些吧。