这个抽象类实现了List接口,继承了AbstractCollection抽象类,是ArrayList的直接父类。
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
这是这个类的基本情况。
protected AbstractList() {
}
这是构造方法。
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
这两个方法一起看,上面那个方法调用第二个方法,传入size()方法的返回值作为第一个参数,size()方法是父类的抽象方法,这个类里没有具体实现。第二个方法这里直接抛出异常。
abstract public E get(int index);
获取指定位置元素的方法,抽象方法。
public E set(int index, E element) {
throw new UnsupportedOperationException();
}
为指定位置设值的方法,这里直接抛出异常。
public E remove(int index) {
throw new UnsupportedOperationException();
}
删除元素的方法,这里直接抛出异常。
public int indexOf(Object o) {
ListIterator<E> it = listIterator();
if (o==null) {
while (it.hasNext())
if (it.next()==null)
return it.previousIndex();
} else {
while (it.hasNext())
if (o.equals(it.next()))
return it.previousIndex();
}
return -1;
}
这个方法是返回参数元素所在下标的方法。
首先获取List迭代器。如果参数为空,就开始迭代元素,发现空元素时,返回迭代器刚迭代的下标。如果参数不为空,也开始迭代,发现元素和参数相等时,返回迭代器刚迭代的下标。如果始终没有返回值,最后返回-1。
public int lastIndexOf(Object o) {
ListIterator<E> it = listIterator(size());
if (o==null) {
while (it.hasPrevious())
if (it.previous()==null)
return it.nextIndex();
} else {
while (it.hasPrevious())
if (o.equals(it.previous()))
return it.nextIndex();
}
return -1;
}
这个方法是返回参数元素最后出现的下标的方法。
首先获取List迭代器,迭代的位置是最后一个元素。首先判断参数是否为空,如果参数为空,则List迭代器开始向前迭代,发现最后一个为空的参数,就返回迭代器刚迭代的下标。如果参数不为空,同样开始向前迭代,判断最后一个和参数相等的元素,则迭代器返回刚迭代的下标。
如果始终没有返回值,则返回-1。
public void clear() {
removeRange(0, size());
}
protected void removeRange(int fromIndex, int toIndex) {
ListIterator<E> it = listIterator(fromIndex);
for (int i=0, n=toIndex-fromIndex; i<n; i++) {
it.next();
it.remove();
}
}
这两个方法一起看,第一个方法是清空所有元素的方法,调用了第二个方法,传入0和本List的长度两个参数。
第二个方法首先获取List迭代器,从第一个参数开始迭代,如果是第一个方法调用来的就是0。
进入for循环,循环两个参数之差次,开始删除元素,删除两个参数之差个,因为迭代器是从第一个参数开始迭代的。