没有值的Java哈希图?

2022-09-01 09:22:52

假设我想将单词放在数据结构中,并且我希望进行持续的时间查找,以查看该单词是否在此数据结构中。我想做的就是看看这个词是否存在。我会为此使用(containsKey())吗?s使用键值>值配对,但在我的情况下,我没有值。当然,我可以使用null作为值,但即使null也需要空间。似乎应该为这个应用程序提供更好的数据结构。HashMapHashMap

集合可能由多个线程使用,但由于集合包含的对象不会更改,因此我认为我没有同步/并发要求。

任何人都可以帮我吗?


答案 1

请改用哈希集。它是 Set 的哈希实现,主要用于您描述的内容(一组无序项目)。


答案 2

您通常使用 Set 的实现,最常见的是 HashSet。如果您确实需要并发访问,则 ConcurrentHashSet 提供了一个插入式替换,可提供安全的并发访问,包括对集合的安全迭代。

在任何情况下,我都建议在整个代码中将其简单地称为Set,除了在构造它的地方;这样,如果以后需要,可以更轻松地将一个实现放入另一个实现中。

即使集合是只读的,如果它被创建它的线程以外的线程使用,你确实需要考虑安全发布(也就是说,确保任何其他线程看到该集合处于一致状态:请记住,任何内存写入,即使在构造函数中,也不能保证在你期望的时间或 otder 中可供其他线程使用, 除非您采取措施确保这一点)。这可以通过以下两种方式完成:

  • 确保对集合的唯一引用位于最终字段中;
  • 确保没有线程修改集合确实是真的。

您可以通过使用 Collections.unmodifiableSet() 包装器来帮助确保后者。这为您提供了给定集合的不可修改的视图 - 因此,如果没有其他“正常”引用来获取集合,您是安全的。