三大数据结构链表、树和图,顺序表作为其中的一种,可以说是平时编程中最长使用到的。List接口是顺序表在java中的实现,它有很多子接口和实现类,平时的编程中使用起来非常方便。但是更进一步,我们有必要对其实现和原理进行理解,并和数据结构中所学比较,并应用于平时的编程中,编写出高效率的代码。
首先看下list接口的层次关系,下图由本人根据jdk的类结构简单画的:
从上图可以看出,list接口有Collection接口衍生而出,那么首先了解下Collection接口。
Collection
collection 是集合框架的根,他定义的集合操作的通用行为,如添加元素、批量添加、删除、批量删除、集合大小、包含、迭代器等。它的接口定义这里不再贴,在关系上,Collection是继承于Iterable接口的,其只有一个方法:
public interface Iterable<T> {
/**
* Returns an {@link Iterator} for the elements in this object.
*
* @return An {@code Iterator} instance.
*/
Iterator<T> iterator();
}
其中Iterator如下:
public interface Iterator<E> {
public boolean hasNext();
public E next();
public void remove();
}
AbstractCollection
AbstractCollection 是Collection接口的抽象实现,实现了其中大部分的功能。如下所示,我们实现自己的Collection只需要实现三个方法即可:
Collection<String> c =
/**
*
*自定义实现示例,在AbstractCollection 中的一些方法的实现中,如Clear,调用了
*iterator()方法,而在这些方法在子类中,实现这是典型的template模式。
*
*/
new AbstractCollection<String>() {
/* *
* 迭代器
*/
@Override
public Iterator<String> iterator() {
// TODO Auto-generated method stub
return null;
}
/*
* 大小
*/
@Override
public int size() {
// TODO Auto-generated method stub
return 0;
}
/*
* 抽象实现是抛出异常,我们需要自己实现
*/
@Override
public boolean add(String e) {
return true;
}
};
如下代码片段摘自AbstractCollection,调用了iterator方法,其中有很多类似代码,如addAll、removeAll、contains、toArray()等,这些实现只是基本的实现,子类中有更有效率的就会覆盖它。典型的可见后面的Arraylist的toArray()。
public void clear() {
Iterator<E> e = iterator();
while (e.hasNext()) {
e.next();
e.remove();
}
}
List
List接口表示数据结构中的链表,其继承collection接口,又往里面添加了一些链表操作的方法,主要是随机访问、删除、查找、专用的迭代器等,如下所示: