12

为什么LinkedList并在JavaArrayList中扩展?AbstractList

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

但是其中的所有方法AbstractList都被ArrayListand覆盖LinkedList

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

4

4 回答 4

14

subList(int,int)方法不会被ArrayListand覆盖LinkedList,为此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()

于 2013-08-23T05:06:56.040 回答
5

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

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

要实现可修改的列表,程序员必须另外覆盖 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 element)、set(int index, Object element)、add(int index, Object element ) 和删除(int index)。

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

于 2013-08-23T05:27:28.083 回答
3

并非所有方法AbstractList都被覆盖。请记住AbstractList子类AbstractCollection,它定义了类似的方法,containsAll或者toString不被任何ArrayList或覆盖的方法LinkedList

于 2013-08-23T05:05:13.830 回答
1

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

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

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

于 2013-08-23T05:07:09.380 回答