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



为什么LinkedListArrayListJava中扩展AbstractList

当我们想在实现类中指定一种常见行为时,就会使用抽象类。

但是AbstractList中的所有方法都被ArrayListLinkedList覆盖。

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

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()

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

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

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

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

与其他抽象Collection实现不同,程序员不必提供Iterator实现;迭代器和listIterator是由这个类实现的,在"随机访问"方法之上:get(int index)、set(int index,Object元素)、set。

该类中每个非抽象方法的文档都详细描述了其实现。如果正在实现的集合允许更有效的实现,则这些方法中的每一个都可能被重写。

并非AbstractList中的所有方法都被重写。请记住,AbstractListAbstractCollection的子类,它定义了像containsAlltoString这样的方法,这些方法既不被ArrayList也不被LinkedList覆盖。

AbstractList源文件的顶部有用法说明

"这个类提供了{@link List}的骨架实现接口,以最大限度地减少实现该接口所需的工作量由"随机访问"数据存储(如数组)支持。对于顺序访问数据(如链表),{@link AbstractSequenceList}应该优先于此类使用。"

因此,从本质上讲,它提供了一些可以构建的方法,以及一个比List接口更健壮的框架。

相关内容

  • 没有找到相关文章

最新更新