[英]Why does adding an element at the end of LinkedList take longer than an ArrayList?
[英]Adding a element of Generic type <T> to an arrayList of LinkedList's
我想在Java中創建一個哈希表類,在其中將鍵值對存儲在鏈表的ArrayList中。 我通過聲明來做到這一點
ArrayList<LinkedList<T>> storage = new ArrayList();
然后,我想創建一個linkList對象,該對象可用於在arrayList的每個索引內創建一個新的鏈表。 我通過聲明:
LinkedList<T> list = new LinkedList<T>();
然后設置我的add函數,將元素添加到arrayed的Hashed鍵索引內的LinkedList的第一個索引中,如下所示:
public void add(K key, T value){
int arrayListIndex = (key.hashCode()) % this.initialCapacity;
System.out.println(arrayListIndex); //This tells us where we access the Array List;
if (hashBrown.get(arrayListIndex) == null){
hashBrown.add(arrayListIndex, list);
hashBrown.get(arrayListIndex).addFirst(value);
}
}
每次運行此代碼時,我都會收到一個錯誤,索引為7,大小為0。這將導致錯誤:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:571)
at java.util.ArrayList.get(ArrayList.java:349)
at FastHashtable.add(FastHashtable.java:72)
at FastHashtable.main(FastHashtable.java:145)
我無法找到該索引超出范圍錯誤的出處,任何人都可以提供建議。 我在使用ArrayLists時是相當陌生的,這使我認為arrayList的原始聲明不正確。
您正在將ArrayList
的容量與其大小混淆。 從Oracle Java文檔中:
每個
ArrayList
實例都有一個容量 。 容量是用於在列表中存儲元素的數組的大小。 它總是至少與列表大小一樣大。 將元素添加到ArrayList
,其容量會自動增長。 除了添加元素具有固定的攤銷時間成本外,沒有指定增長策略的詳細信息。
相反,您應該考慮創建一個普通數組(例如Object[] a = new Object[maxSize]
),在其中您可以實際為任意索引值分配對象(在這種情況下為鏈接列表)。 如果只想存儲鏈接列表,請創建一個LinkedList<T>[]
數組。
如果其中有0個元素,則不能將其添加到索引7的列表中。 您只能在末尾添加(使用不帶索引的add
方法)或在不大於當前列表的size()
。
當列表為空並且在索引7處添加內容時,您期望列表在第一位置包含什么,在索引6處包含什么? (我曾經創建過一個list的子類,當附加索引大於列表的大小時,它會使用null
填充索引中的所有內容,但是這種行為並不通用,不足以成為List
語義的一部分。
[編輯以回應此處的評論和praseodym的回答]
您可以簡單地用空值填充(數組)列表,而在首次訪問相應位置時,將其替換為鏈接列表。 (不過,請確保使用set
而不是add
,這可能也是您上面想要的。)或者,您可以創建所需大小的數組(默認情況下將充滿null
)並將其“包裝”通過Arrays.asList
放入一個(不可調整大小的)列表。 但是,您必須忽略“未經檢查的轉換”警告(但是,並不是在使用數組時可以避免出現警告)。 另外,我建議您閱讀“ 編程到接口,而不是實現 ”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.