我需要在索引 i 处的 ArrayList 中插入 Person 类型的元素(我自己定义的类)
我知道我可以使用add(int index, E element)
.
但是有没有任何有效的方法可以做到这一点,因为在我的列表中平均需要大约 1.5 毫秒(收集超过 1000 次插入然后平均的数据)。
我需要在索引 i 处的 ArrayList 中插入 Person 类型的元素(我自己定义的类)
我知道我可以使用add(int index, E element)
.
但是有没有任何有效的方法可以做到这一点,因为在我的列表中平均需要大约 1.5 毫秒(收集超过 1000 次插入然后平均的数据)。
如果您的任务是更密集的插入/删除,您始终可以使用java.util.LinkedList。
对于LinkedList
:
对于ArrayList
:
这种插入发生在 O(n) 中,因为它必须向下移动所有元素,最坏的情况是它会将每个元素向下移动。(更正的 java 说它是 O(n) 因为他们使用数学公式来插入)
如果您想要快速插入,请将其添加到数组列表的末尾或使用恒定时间的哈希图。
插入hashmap:HashMap peopleMap = new Hashmap.....
peopleMap.put(person.name, person); //(或任何你想跟踪的)
这会将键设置为人员姓名,并将值设置为人员。
您还可以尝试使用带有键的哈希图(您要跟踪的 ehatver)并评估此人在持有人数组中的索引。插入是 O(i),查找 O(i),您也可以对其进行排序(我将把它作为练习留给读者)
如果这样做的全部目的是排序,那么为简单起见,您可以插入优先队列(nLogn),然后将所有内容弹出到数组中,这将为您提供排序数组
如果您添加使用
arryListInstance.add(positionIndex, Object);
该对象将在将现有对象筛选 1 个位置后添加。因此,此操作的平均情况变为O(n)。
虽然简单的添加
arryListInstance.add(positionIndex, Object);
将对象添加到 arrayListInstance 的末尾。在最好的情况下,这个操作是O(1),但在最坏的情况下,当达到最大容量时它变成O(n):因为内部创建了一个新的 ArrayList 实例并且所有内容都复制到那里。
您面临这个问题是因为可以避免第一个原因的两个原因之一: