而这其中调用的iterator()方法是一个抽象方法,有赖于具体的数据结构的实现。但是对于这个containers()方法而言,并不需要知道具体的Iterator实现,而只需要知道它所提供的接口,能够完成某类任务既可,这就是抽象类中抽象方法的作用。其它的在AbstractCollection中实现的非抽象方法,大部分都是依赖于抽象方法iterator()方法所提供的Iterator接口来实现的。这种设计方法是引入抽象类的一个关键所在,值得仔细领悟。
List接口继承Collection接口,提供对列表集合类的抽象;对应的AbstractList类继承AbstractCollection,并实现了List接口,作为List的一个抽象基类。它对其中非抽象方法的实现,也大抵上与AbstractCollection相同,这儿不再赘叙。
而对应于Collection的Iterator,List有其自己的ListIterator,ListIterator继承于Iterator,并添加了一些专用于List遍历的方法:
boolean hasPrevious():判断在列表中当前元素之前是否存在有元素。
Object previous():返回列表中当前元素之前的元素。
int nextIndex():
int previousIndex():
void set(Object o):
void add(Object o):
ListIterator针对List,提供了更为强劲的功能接口。在AbstractList中,实现了具体的iterator()方法和listIterator()方法,我们来看看这两个方法是如何实现的:
public Iterator iterator() {
return new Itr(); //Itr是一个内部类
}
private class Itr implements Iterator {
int cursor = 0;//Iterator的计数器,指示当前调用next()方法时会被返回的元素的位置
int lastRet = -1;//指示刚刚通过next()或者previous()方法被返回的元素的位置,-1
//表示刚刚调用的是remove()方法删除了一个元素。
//modCount是定义在AbstractList中的字段,指示列表被修改的次数。Iterator用//这个值来检查其包装的列表是否被其他方法所非法修改。
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size();
}
public Object next() {
try {
//get方法仍然是一个抽象方法,依赖于具体的子类实现
Object next = get(cursor);
文章来源于领测软件测试网 https://www.ltesting.net/