假设我想在数据结构中添加单词,并且我希望有时间查找,以查看该单词是否在此数据结构中。我想做的就是看看这个词是否存在。我会为此使用HashMap
(containsKey())吗? HashMap
使用key->值配对,但在我的情况下,我没有值。当然我可以使用null作为值,但即使null也需要空格。看起来这个应用程序应该有更好的数据结构。
该集合可能被多个线程使用,但由于集合中包含的对象不会改变,我认为我没有同步/并发要求。
任何人都可以帮助我吗?
答案 0 :(得分:44)
答案 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中或其他线程中可用于其他线程,除非你采取措施确保这一点)。这可以通过以下两种方式完成:
您可以使用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,您可能会找到更符合您需求的信息。