1

由于 LinkedHashMap/Set 保持 Collection 中的条目顺序,因此会导致性能稍低。我想知道为什么会这样。

4

3 回答 3

6

LinkedHash[Map/Set]使用双向链表来跟踪条目的顺序。因此,无论何时添加一个元素,都必须创建一个新的 DLL 节点。分配需要时间,并且需要设置几个额外的指针。

于 2012-04-08T15:51:45.690 回答
1

问题是做出了一个无效的假设,即 LinkedHash[Map/Set] 的性能总是比它们的非链接对应物差。

LinkedHash[Map/Set] 具有维护用于形成链表的指针的额外任务,这意味着在执行添加或删除时性能比 Hash[Map/Set] 稍差(尽管仍然是恒定时间)。

然而,当迭代 LinkedHash[Map/Set] 时,性能与集合的大小成正比,而非链接对应物与集合的容量成正比。当迭代 Hash[Map/Set] 时,最好的情况是容量刚好足以容纳所有元素(即容量=大小),并且在这种情况下它具有相同的性能。另请记住,除非您有一个非常静态的集合/地图并且您设置了容量,否则容量不太可能等于大小。

因此,如果您更关心构建地图/集的性能,那么您应该选择 HashMap 或 HashSet,但如果您更关心迭代该地图/集,请选择 LinkedHashMap 或 LinkedHashSet。

另见:http ://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html

于 2013-03-12T00:46:11.027 回答
0

LinkedHashMap/Set包含两种数据结构:哈希表和链表,因此插入和删除操作会导致对两种数据结构的修改,而简单的相同操作HashMap仅触及一种数据结构(哈希表)。这就是为什么LinkedHashMap/Set速度较慢并消耗更多内存的原因。

于 2012-04-08T15:53:35.780 回答