【问题标题】:Insertion order in CopyOnWriteArraySet VS HashSetCopyOnWriteArraySet VS HashSet 中的插入顺序
【发布时间】:2020-12-11 14:59:58
【问题描述】:

每个人都知道HashSet 根据哈希表的大小和元素的哈希码值将元素存储在 buckets 中。

但是CopyOnWriteArraySet 是如何存储元素的呢?我认为它会对这些存储桶进行快照并复制它们。好像没有。它是否将它们一一存储在“正常”数组中并检查equals()? 它甚至使用哈希原理吗?

【问题讨论】:

  • Looks like 它只是 CopyOnWriteArrayList 的包装器,它使用普通数组存储。

标签: java copyonwritearraylist


【解决方案1】:

CopyOnWriteArraySetSetCopyOnWriteArrayList 包装器,它将其元素存储在一个数组中,因此它不使用散列。这就是为什么它没有 HashSet 的 O(1) 查找优势。

文档说它只适合小套装。

【讨论】:

  • 非常感谢!你知道他们为什么坚持使用 CopyOnWriteArrayList 实现吗?他们不能在 HashSet 上制作类似副本以进行修改吗?在这种情况下,我们将获得查找优势,并且元素将被复制到哈希表快照中。我错过了什么吗?
  • 我不知道为什么有人会做出任何特定的决定,但请查看 this questionthis one 讨论 CopyOnWriteArraySet 何时有用。
  • 谢谢,是的,我知道何时使用它。我很好奇为什么将其快照存储在普通数组而不是存储桶中......
  • 如果“何时使用”指定“仅在涉及非常小的集合时”,这就是使用普通数组存储而不是哈希表的实际原因。
  • 没错,有道理。从内存的角度来看,它也会占用更少的空间,对吧?因为如果它使用了 CopyOnWriteHashSet,它需要在每个存储桶上存储整个 hashtable +linkedList,对吗?
猜你喜欢
  • 2010-10-14
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2015-05-28
  • 2011-02-11
  • 2023-03-16
相关资源
最近更新 更多