[英]Why LinkedList and arraylist extends AbstractList in java?
為什么LinkedList
和ArrayList
在Java中擴展AbstractList
?
當我們要在實現類中指定常見行為時,將使用抽象類。
但是AbstractList
中的所有方法都被ArrayList
和LinkedList
覆蓋。
那么擴展此類的用途是什么?
subList(int,int)
方法不會同時被ArrayList
和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()
您可以從這里“ 抽象列表”中獲得答案。
此類提供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
,它定義了諸如containsAll
或toString
類的方法,這些方法不會被ArrayList
或LinkedList
覆蓋。
用法記錄在AbstractList源文件的頂部
“此類提供了{@link List}接口的基本實現,以最小化實現由“隨機訪問”數據存儲(如數組)支持的該接口所需的工作。對於順序訪問數據(如鏈表) ),則應優先使用{@link AbstractSequentialList}此類。”
因此,從本質上講,它提供了一些構建方法以及一個比List接口更健壯的框架。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.