
[英]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.