确定值是否在Java中的一组值中的最快方法是什么?

时间:2012-02-17 21:50:29

标签: java set exists

对于JAVA专家来说这可能是一个简单的问题,但我比较新,所以我想我会问。我需要测试字符串X是否存在于集合中。我不需要任何相关的值或索引,我也不需要任何订单。我只需要知道它是否存在。我知道这可以使用HashMap或ArrayList来实现,但这些看起来有点过分。该怎么办?只是一个清单?或者是否有更基本的东西可以达到同样的目的。测试某个字符串X是否存在于给定集合中的最快方法是什么?

6 个答案:

答案 0 :(得分:8)

听起来你想要一个HashSet<String>

Set<String> set = new HashSet<String>();
set.add("foo");
set.add("bar");

boolean no = set.contains("baz");
boolean yes = set.contains("foo");

当然还有其他Set实现可用,但HashSet可能是最合适的。

答案 1 :(得分:1)

你没有ArrayListHashMap,JDK提供了各种各样的课程,你可以在其中找到你想要的东西:集。

其中一个例如HashSet,它具有您正在寻找的功能..

Set<String> set = new HashSet<String>();

set.add("foo");
set.add("bar");

boolean b = set.contains("foo");

答案 2 :(得分:0)

import java.util.Arrays;

...

if (Arrays.asList("foo", "bar", "baz").contains(myString)) {
    ...
}

答案 3 :(得分:0)

  

我知道这可以使用HashMap或ArrayList来实现,但那些看起来有些过分。

使用设计的内置类完全按照你想要的方式进行“过度杀戮”是什么,并且做得非常快?因为那就是HashMapHashSet在它的接口(而不是映射的值)中会更基本,但它实际上是通过使HashMap具有空值来实现的。

答案 4 :(得分:0)

有几个答案提出HashSet,其他人已经指出,较小的集合对于小集合来说可能更快 - 你还没有说出集合的大小。

字符串的大小也是相关的,因为HashSet等将使用字符串的哈希码,它是从字符串的整个内容(然后缓存)计算出来的。这可能需要一些时间 - 但另一方面,它可能已经计算过,具体取决于您的代码,因此不会产生额外费用。

在某些情况下,您可以根据其大小排除字符串中的字符串,或者检查前几个字符 - 这取决于您的数据和字符串集。像Trie这样的数据结构在这里很有用 - (但你想要一个简单的解决方案)。

如果性能至关重要,那么您需要在实际条件下仔细对所有建议的解决方案进行基准测试。见How do I write a correct micro-benchmark in Java?

如果你真的需要一个快速的解决方案(这对你的应用程序实际上至关重要吗?)那么你可能需要容忍'过度杀伤'!

答案 5 :(得分:0)

不要使用包含 Collections.binarySearch(List,Object)

在使用此方法之前不要忘记排序 Collections.sort(列表)