由于 LinkedHashMap/Set 保持 Collection 中的条目顺序,因此会导致性能稍低。我想知道为什么会这样。
3 回答
LinkedHash[Map/Set]
使用双向链表来跟踪条目的顺序。因此,无论何时添加一个元素,都必须创建一个新的 DLL 节点。分配需要时间,并且需要设置几个额外的指针。
问题是做出了一个无效的假设,即 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
LinkedHashMap
/Set
包含两种数据结构:哈希表和链表,因此插入和删除操作会导致对两种数据结构的修改,而简单的相同操作HashMap
仅触及一种数据结构(哈希表)。这就是为什么LinkedHashMap
/Set
速度较慢并消耗更多内存的原因。