查找String值的最快方法

PNS*_*PNS 1 java string comparison data-structures

我有一个简单的应用程序,它从大文本文件中读取小字符串中的数据并将它们保存到数据库中.为了实际保存每个这样的String,应用程序调用以下几种方法(可能数千次或更多次):

setValue(String value)
{
    if (!ignore(value))
    {
         // Save the value in the database
    }
}
Run Code Online (Sandbox Code Playgroud)

目前,我ignore()只是通过连续比较一组字符串来实现该方法,例如

public boolean ignore(String value)
{
    if (value.equalsIgnoreCase("Value 1") || (value.equalsIgnoreCase("Value 2"))
    {
        return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

但是,因为我需要检查许多这样的"可忽略"值,这些值将在代码的另一部分中定义,我需要使用数据结构进行此检查,而不是多个连续if语句.

所以,我的问题是,从标准Java到实现它的最快数据结构是什么?一个HashMap?一套?别的什么?

初始化时间不是问题,因为它将静态发生,每次应用程序调用一次.

编辑:到目前为止建议的解决方案(包括HashSet)看起来比仅使用String []和所有被忽略的单词并且只针对其中每一个运行"equalsIgnoreCase"要慢.

Boh*_*ian 5

使用HashSet,以小写形式存储值,以及contains()方法,它具有比TreeSet更好的查找性能(包含的常量时间与对数时间).

Set<String> ignored = new HashSet<String>();
ignored.add("value 1"); // store in lowercase
ignored.add("value 2"); // store in lowercase

public boolean ignore(String value) {
    return ignored.contains(value.toLowerCase());    
}
Run Code Online (Sandbox Code Playgroud)

以小写形式存储值并搜索小写输入可以避免比较期间处理大小写的麻烦,因此您可以获得HashSet实现的全速和零集合相关代码(例如Collat​​or,Comparator等).

编辑
感谢Jon Skeet指出某些土耳其字符在通话时表现得很奇怪toLowerCase(),但如果您不打算支持土耳其语输入(或者其他语言可能存在非标准问题),那么这种方法对您来说效果很好.