Java LinkHashMap/LinkedHashSet中的迭代顺序如何导致比HashMap稍低的性能

Java LinkHashMap/LinkedHashSet中的迭代顺序如何导致比HashMap稍低的性能,java,collections,linkedhashmap,linkedhashset,Java,Collections,Linkedhashmap,Linkedhashset,由于LinkedHashMap/Set保持集合中条目的顺序,因此会导致性能稍低。 我想知道为什么会发生这种情况。LinkedHash[Map/Set]使用双链接列表跟踪条目的顺序。因此,无论何时添加元素,都必须创建一个新的DLL节点。分配需要时间,需要设置几个额外的指针。LinkedHash[Map/set]使用双链接列表跟踪条目的顺序。因此,无论何时添加元素,都必须创建一个新的DLL节点。分配需要时间,需要设置几个额外的指针。LinkedHashMap/set包含两个数据结构:哈希表和链表,因

由于LinkedHashMap/Set保持集合中条目的顺序,因此会导致性能稍低。
我想知道为什么会发生这种情况。

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

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

LinkedHashMap
/
set
包含两个数据结构:哈希表和链表,因此插入和删除操作会导致修改两个数据结构,而在simple
HashMap
上的相同操作只涉及一个数据结构(哈希表)。这就是为什么
LinkedHashMap
/
Set
速度较慢且占用更多内存的原因。

LinkedHashMap
/
Set
包含两个数据结构:哈希表和链表,因此插入和删除操作会导致修改两个数据结构,而在simple
HashMap
上的相同操作只涉及一个数据结构(哈希表)。这就是为什么
LinkedHashMap
/
Set
速度较慢且占用更多内存的原因。

问题在于,LinkedHash[Map/Set]的性能总是比其未链接的对应项差,这一假设是无效的

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

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

因此,如果您更关心构建映射/集的性能,那么您应该选择HashMap或HashSet,但是如果您更关心在该映射/集上进行迭代,那么请选择LinkedHashMap或LinkedHashSet


另请参见:

问题在于,LinkedHash[Map/Set]的性能总是比其未链接的对应项差,这一假设是无效的

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

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

因此,如果您更关心构建映射/集的性能,那么您应该选择HashMap或HashSet,但是如果您更关心在该映射/集上进行迭代,那么请选择LinkedHashMap或LinkedHashSet

另见: