繁体   English   中英

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

[英]Why LinkedList and arraylist extends AbstractList in java?

为什么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()

您可以从这里“ 抽象列表”中获得答案。

此类提供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实现。 迭代器和listIterator由此类实现,在“随机访问”方法之上:get(int index),set(int index,Object元素),set(int index,Object元素),add(int index,Object元素) )和remove(int index)。

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

并非AbstractList中的所有方法都被覆盖。 请记住, AbstractList子类化AbstractCollection ,它定义了诸如containsAlltoString类的方法,这些方法不会被ArrayListLinkedList覆盖。

用法记录在AbstractList源文件的顶部

“此类提供了{@link List}接口的基本实现,以最小化实现由“随机访问”数据存储(如数组)支持的该接口所需的工作。对于顺序访问数据(如链表) ),则应优先使用{@link AbstractSequentialList}此类。”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM