Java的equalsIgnoreCase的正确替代是什么?

时间:2014-10-30 07:03:57

标签: java string localization string-comparison

由于不正确使用区域设置,java.lang.String.equalsIgnoreCase失败的原因和时间有很多很多例子。

但我没有找到任何正确方法的例子。与java.lang.String.toUpperCase不同,没有带语言环境参数的版本。将两个字符串转换为大写或小写似乎都是浪费。特别是在进行大量比较的应用程序时。

在考虑区域设置和性能的情况下,进行忽略大小写字符串比较的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

根据this page,您可以使用Collat​​or进行不区分大小写的相等操作,如下所示:

//retrieve the runtime user's locale
Locale locale = new Locale(getUserLocale());

//pass the user's locale as an argument
Collator myCollator = Collator.getInstance(locale);

//set collator to Ignore case but not accents
//(default is Collator.TERTIARY, which is
//case sensitive)
myCollator.setStrength(Collator.SECONDARY);

int i = myCollator.compare(stringA,stringB);

(从以上网站复制......)

显然,在其他情况下,您可能会选择不同的语言环境。


对于@fge - 这个Oracle Bug报告举例说明了发生的事情。

答案 1 :(得分:0)

可能的替代方案可能是滥用正则表达式。这对于动态更改字符串非常具有性能密集性,但如果您要与常量进行比较,可以成为另一种选择:

Matcher matcher = Pattern.compile("^" + myOtherString + "$",
    Pattern.CASE_INSENSITIVE | Pattern.LITERAL | Pattern.UNICODE_CASE).matcher();
if (matcher.matches(myString)) {
   // ...
}

这将锚定要与之比较的字符串,指定Literal字符串的Unicode-aware不区分大小写的匹配。