没有值的Java哈希映射?

时间:2009-05-13 00:56:43

标签: java hashmap lookup containskey

假设我想在数据结构中添加单词,并且我希望有时间查找,以查看该单词是否在此数据结构中。我想做的就是看看这个词是否存在。我会为此使用HashMap(containsKey())吗? HashMap使用key->值配对,但在我的情况下,我没有值。当然我可以使用null作为值,但即使null也需要空格。看起来这个应用程序应该有更好的数据结构。

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

任何人都可以帮助我吗?

6 个答案:

答案 0 :(得分:44)

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

答案 1 :(得分:7)

您可能想要使用java.util.Set。实现包括java.util.HashSet,它是HashMap的Set等价物。

即使集合中包含的对象没有更改,您也可能需要进行同步。将Set传递给另一个线程后,是否需要将新对象添加到Set中?如果是这样,您可以使用Collections.synchronizedSet()来设置线程安全。

如果你有一个带有值的Map,并且你有一些代码只想将Map视为一个Set,你可以使用Map.entrySet()(但请记住,entrySet返回一个键的Set视图) Map;如果Map是可变的,可以通过entrySet返回的集合更改Map。

答案 2 :(得分:7)

您通常使用 Set 的实现,通常使用HashSet。如果确实需要并发访问,那么ConcurrentHashSet提供了一个直接替换,它提供安全的并发访问,包括对集合的安全迭代。

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

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

  • 确保该集合的唯一引用位于final fields;
  • 确保没有线程修改集合确实是真的。

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

答案 3 :(得分:6)

您希望使用实现Set接口的Collection,可能使用HashSet来获得您声明的性能。见http://java.sun.com/javase/6/docs/api/java/util/Set.html

答案 4 :(得分:1)

除了Set以外,在某些情况下,您可能希望将Map转换为Set Collections.newSetFromMap(Map<E,Boolean>)(某些Map s disallow {{ 1}}值,因此null)。

答案 5 :(得分:-1)

正如大家所说HashSet可能是最简单的解决方案,但你不会在HashSet中进行恒定的时间查找(因为条目可能被链接),你将为每个条目存储一个虚拟对象(总是相同的)...... / p>

有关信息here a list of data structures,您可能会找到更符合您需求的信息。