对于JAVA专家来说这可能是一个简单的问题,但我比较新,所以我想我会问。我需要测试字符串X是否存在于集合中。我不需要任何相关的值或索引,我也不需要任何订单。我只需要知道它是否存在。我知道这可以使用HashMap或ArrayList来实现,但这些看起来有点过分。该怎么办?只是一个清单?或者是否有更基本的东西可以达到同样的目的。测试某个字符串X是否存在于给定集合中的最快方法是什么?
答案 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)
你没有ArrayList
和HashMap
,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来实现,但那些看起来有些过分。
使用设计的内置类完全按照你想要的方式进行“过度杀戮”是什么,并且做得非常快?因为那就是HashMap
。 HashSet
在它的接口(而不是映射的值)中会更基本,但它实际上是通过使HashMap
具有空值来实现的。
答案 4 :(得分:0)
有几个答案提出HashSet
,其他人已经指出,较小的集合对于小集合来说可能更快 - 你还没有说出集合的大小。
字符串的大小也是相关的,因为HashSet
等将使用字符串的哈希码,它是从字符串的整个内容(然后缓存)计算出来的。这可能需要一些时间 - 但另一方面,它可能已经计算过,具体取决于您的代码,因此不会产生额外费用。
在某些情况下,您可以根据其大小排除字符串中的字符串,或者检查前几个字符 - 这取决于您的数据和字符串集。像Trie这样的数据结构在这里很有用 - (但你想要一个简单的解决方案)。
如果性能至关重要,那么您需要在实际条件下仔细对所有建议的解决方案进行基准测试。见How do I write a correct micro-benchmark in Java?
如果你真的需要一个快速的解决方案(这对你的应用程序实际上至关重要吗?)那么你可能需要容忍'过度杀伤'!
答案 5 :(得分:0)
不要使用包含 Collections.binarySearch(List,Object)
在使用此方法之前不要忘记排序 Collections.sort(列表)