我需要在索引i处将一个类型为Person的元素(我的自定义类)插入ArrayList中。
我知道可以使用
但是是否有更有效的方法来做到这一点,因为在我的列表中,平均需要1.5毫秒(收集1000个插入数据然后求平均值)?
我知道可以使用
add(int index, E element)
。但是是否有更有效的方法来做到这一点,因为在我的列表中,平均需要1.5毫秒(收集1000个插入数据然后求平均值)?
add(int index, E element)
。对于LinkedList
:
对于ArrayList
:
这个插入操作的时间复杂度是O(n),因为它必须将所有元素下移,最坏情况下会将每个元素都下移。(修正后的Java表示它是O(n),因为他们使用了一个数学公式来进行插入)
如果你想要快速插入,可以将其添加到ArrayList的末尾或使用HashMap,因为它是常数时间。
在HashMap中插入:
HashMap peopleMap = new Hashmap.....
peopleMap.put(person.name, person); //(或者你想要跟踪的任何内容)
这将把键设置为人名,值设置为person。
你也可以尝试使用带有键(你想要跟踪的任何内容)和值(人员在持有人数组中的索引)的HashMap。插入是O(i),查找是O(i),你还可以对其进行排序(我将把这留给读者作为练习)。
如果整个目的是为了排序,那么为了简单起见,你可以将其插入到优先队列中(nLogn),然后将所有内容弹出到数组中,这将给你一个排序后的数组。
put(index, value);
其中 index 是键。 - Andrea Ligios如果你使用“using”关键字
arryListInstance.add(positionIndex, Object);
在筛选现有对象1个位置后,该对象将被添加。因此,这个操作的平均情况为O(n)。
而简单添加
arryListInstance.add(positionIndex, Object);
将对象添加到arrayListInstance的末尾。在最好的情况下,此操作的时间复杂度为O(1),但在最坏的情况下,当达到最大容量时,它变为O(n):因为内部会创建一个新的ArrayList实例,并将所有内容复制到其中。
您面临这个问题是因为两个原因中的其中一个,第一个可以避免:
ArrayList
,LinkedList
更适合用于列表的插入/删除操作。 - Guillaume PoletLinkedList
中复制数据是正确的;但是查找索引n
将是一个O(n)
操作,因为您必须遍历整个列表。我怀疑System.arraycopy
可能具有更快的常数因子,因此仍然更快。 - Boris the SpiderArrayList
已经在内部使用了System.arraycopy
- 没有理由让你自己使用它。 - Boris the SpiderArrayList
的indexOf
实现也是O(n)
。请参考这个答案进行全面比较。我的陈述只涉及添加/删除操作。 - Guillaume Polet