HashMap vs. ArrayList 插入性能混淆

HashMap vs. ArrayList insertion performance confusion

根据我的理解,hashmap 插入是 O(1),对于 arraylist,插入是 O(n),因为对于 hashmap,hashfunction 计算哈希码和索引并插入条目,数组列表每隔进入新元素的时间。

首先,复杂度为 O(1) 的操作并不总是比复杂度为 O(n) 的操作花费的时间更少。 O(1) 只意味着操作需要一个常数时间(可以是任何值),而不管输入的大小。 O(n) 意味着操作所需的时间随着输入的大小线性增加。这意味着仅当 n 为无穷大时,O(1) 理论上保证比 O(n) 花费更少的时间。

现在来看您的示例,ArrayList.add() 操作在分摊的常数时间内运行,这意味着尽管特定迭代可能需要 O(n) 时间,但随着时间的推移平均复杂度为 O (1).有关摊销常数时间的更多信息,请参阅 this 问题。

ArrayListArrayList 的最后添加项目时比 HashMap 快,因为不需要将 ArrayList 中的元素移动到在右边,如果你在 ArrayList 的前面添加一个项目,你可以看到 HashMap 的效率,就像这样 arrayList.add(0, str).

检查时使用 1000 作为外循环而不是 100000 否则它可能会挂起。