簡體   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