为什么LinkedList和arraylist在java中扩展AbstractList?

时间:2013-08-23 05:00:05

标签: java list collections arraylist linked-list

为什么LinkedListArrayList Java 中扩展AbstractList

当我们想要在实现类中指定公共行为时,使用抽象类。

AbstractListArrayList会覆盖LinkedList中的所有方法。

那么扩展这个类有什么用?

4 个答案:

答案 0 :(得分:11)

subList(int,int)方法未被ArrayListLinkedList覆盖,而AbstractList提供了一个通用的实现

来自Java源代码

public List<E> subList(int fromIndex, int toIndex) {
        return (this instanceof RandomAccess ?
                new RandomAccessSubList<E>(this, fromIndex, toIndex) :
                new SubList<E>(this, fromIndex, toIndex));
    }

此外,还有其他方法未被覆盖,例如toString()iterator()

答案 1 :(得分:5)

你可以从这里获得答案,,, AbstractList

此类提供List接口的骨干实现,以最大限度地减少实现由“随机访问”数据存储(例如数组)支持的此接口所需的工作量。对于顺序访问数据(例如链接列表),应优先使用AbstractSequentialList,而不是此类。 要实现不可修改的List,程序员只需扩展此类并提供get(int index)和size()方法的实现。

要实现可修改的List,程序员必须另外覆盖set(int index,Object element)方法(否则会抛出UnsupportedOperationException。如果List是可变大小的,程序员必须另外覆盖add(int index,Object) element)和remove(int index)方法。

程序员通常应该根据Collection接口规范中的建议提供void(无参数)和Collection构造函数。

与其他抽象Collection实现不同,程序员不必提供Iterator实现; iterator和listIterator由这个类实现,顶部是“随机访问”方法:get(int index),set(int index,Object element),set(int index,Object element),add(int index,Object element) )并删除(int index)。

此类中每个非抽象方法的文档详细描述了它的实现。如果正在实施的集合允许更有效的实现,则可以覆盖这些方法中的每一个。

答案 2 :(得分:3)

并非所有来自AbstractList的方法都被覆盖。请记住AbstractList子类AbstractCollection,它定义了containsAlltoString等未被ArrayListLinkedList覆盖的方法。

答案 3 :(得分:1)

用法在AbstractList源文件的顶部注明

“此类提供{@link List}的骨干实现  接口,以最小化实现此接口所需的工作量  由“随机访问”数据存储(例如数组)支持。顺序  访问数据(如链表),{@link AbstractSequentialList}应该  比这个班更优先使用。“

所以基本上它提供了一些构建方法和一个比List接口更健壮的框架。