Java-Collection:这个非常具体的案例使用哪些集合?

时间:2018-06-19 11:01:12

标签: java collections hashset

我有以下情况,我正在寻找"最佳"实现:

  1. 我想将项目存储在java.util.Collection中以实现接口
  2. 保证所有商品都有唯一的hashCode
  3. 我知道要存储的项目的最大数量n(初始化时已知最大capacity
  4. hashCode介于0n
  5. 之间
  6. 订单并不重要,不需要重复(Set - 需要属性)
  7. 可以添加项目,但永远不会删除
  8. contains的效果非常重要(需要:O(1),至少O(log_n)
  9. 我的第一个想法是使用new HashSet<item>(n+1, 1.0),但经过一些阅读后我发现它将内部哈希函数应用于项目的hashCode,因此仍会发生哈希冲突,即使hashCodes是唯一的hachCode <= n

    我的第二个想法是使用本机数组(new item[n])并使用hashCode作为索引。这似乎是具有最佳性能的实现,但我的界面需要java.util.Collection,并且该集合将与containsadd一起使用,这与第二个的好处不兼容方法

    我是否遗漏了某些内容,或者我是否必须接受HashSet的开销和冲突才能获得最佳效果?

2 个答案:

答案 0 :(得分:4)

使用HashSet仍然可以提供良好的性能,但考虑到您描述的特定要求(并假设n它不是太大),您可以创建自己的{ArraySet'实现{{ 1}} interface:

  • 它将有一个长度为Set的后备数组来存储数据。
  • n+1将使用元素的contains来查找与hashCode匹配的索引是否具有非空值。
  • hashCode()将使用添加元素的add来查找应添加元素的数组的索引。
  • 任何其他所需方法都将以类似方式实施。

此解决方案可能比hashsCode稍微更有效,因为它包含更少的开销。但是,如果HashSet很大,它将在内存使用方面具有广泛性。

答案 1 :(得分:0)

鉴于需求,建议您使用HashSet。它将表现更好。正如您提到的,最大元素数和Set的最大容量都具有相同的大小。此外,每个元素具有唯一的哈希码。在这种情况下,哈希键冲突很少发生变化。因此,不必担心contains函数。使用提到的数据集,包含将在O(1)中执行。同样,添加也将以不变的顺序执行。即O(1)。