Java 如何使字符串比较不区分大小写?
我创建了一个Java程序来比较两个字符串:Java 如何使字符串比较不区分大小写?,java,string,comparison,case-insensitive,Java,String,Comparison,Case Insensitive,我创建了一个Java程序来比较两个字符串: String str = "Hello"; if (str.equals("hello")) { System.out.println("match"); } else { System.out.println("no match"); } 它是区分大小写的。如何更改它以使其不可用?使用String.equalsIgnoreCase() 使用Java A
String str = "Hello";
if (str.equals("hello")) {
System.out.println("match");
} else {
System.out.println("no match");
}
它是区分大小写的。如何更改它以使其不可用?使用
String.equalsIgnoreCase()
使用Java API参考查找如下答案:
最好的方法是使用。它专门为此目的进行了优化
您还可以将这两个字符串转换为大写或小写,然后再与equals
进行比较。这是一个技巧,对于其他可能没有等价于equalsIgnoreCase
的语言来说非常有用
str.toUpperCase().equals(str2.toUpperCase())
如果您使用的是非罗马字母表,请注意equalsIgnoreCase
的JavaDoc的这一部分
请注意,此方法不考虑区域设置,并且将
导致某些地区的结果不令人满意。这个
类提供区分区域设置的比较
使用
s1.equalsIgnoreCase(s2)
:。您可以使用有关字符串的更多信息,请参见和您必须使用字符串对象的CompareTignoreCase
方法
int compareValue = str1.compareToIgnoreCase(str2);
if(compareValue==0)
表示str1
等于str2str2请注意,在执行.equals或.equalsIgnoreCase之前,您可能还需要对它们进行空检查
空字符串对象不能调用equals方法
即:
在默认Java API中,您有:
String.CASE_INSENSITIVE_ORDER
因此,如果要使用具有排序数据结构的字符串,则不需要重写比较器
String s = "some text here";
s.equalsIgnoreCase("Some text here");
这是您希望在自己的代码中进行纯相等检查的内容
只是想进一步了解有关Java中字符串相等的信息。java.lang.String类的hashCode()函数“区分大小写”:
然后按如下方式使用:
HashMap<HashWrap, Object> map = new HashMap<HashWrap, Object>();
HashMap map=newhashmap();
公共布尔值newEquals(字符串str1、字符串str2)
{
int len=str1.length();
int len1=str2.length();
if(len==len1)
{
对于(int i=0,j=0;i
现在它将输出:hai
对于简单的不区分大小写的字符串比较来说是最实用的选择
但是,值得注意的是,该方法既不进行全大小写折叠,也不进行分解,因此无法按照Unicode标准中的规定执行无大小写匹配。事实上,JDK API不提供对大小写折叠字符数据信息的访问,因此最好将此任务委托给经过测试的thir民主党图书馆
该库是,下面是实现不区分大小写字符串比较实用程序的方法:
import com.ibm.icu.text.Normalizer2;
// ...
public static boolean equalsIgnoreCase(CharSequence s, CharSequence t) {
Normalizer2 normalizer = Normalizer2.getNFKCCasefoldInstance();
return normalizer.normalize(s).equals(normalizer.normalize(t));
}
在大写或小写字符串上与String.equalsIgnoreCase
或String.equals
进行简单比较,即使是这个简单的测试也会失败
(请注意,预定义的大小写折叠风格是独立于语言环境的;对于土耳其语言环境,可能需要进行更多的工作。)要实现空安全,可以使用
org.apache.commons.lang.StringUtils.equalsIgnoreCase(String, String)
或
如果您知道它区分大小写,则可以在比较之前将其转换为小写或大写。如果您使用s1.equalsIgnoreCase(s2)
,则可能无法在需要执行此操作的任何位置执行此操作。我建议您找到字符串的来源--可能是文件、数据库或用户输入--并将其转换为大写(或小写)并继续使用.equals进行比较。不要转换为小写/大写(如上面的注释所示),使用公认的equalsIgnoreCase
方法。请阅读Turkish I问题和类似Unicode问题的基本原理。@OhadSchneiderequalsIgnoreCase
为Turkish返回了错误的值,因为它在比较“I”和“I”时返回true,即使它应该返回false。所以我怀疑如果你想考虑区域设置,一个Collator
实际上是一种方法。@OhadSchneider我想知道。它说每个字符都这样做会产生相同的结果,但是对整个字符串执行toLowerCase
/toUpperCase
并对每个字符执行,会得到相同的结果还有两种不同的结果。请注意,这两种解决方案并不一定适用于所有语言环境。String#equalsIgnoreCase不使用特定于语言环境的大小写规则,而String#toLowerCase和#toUpperCase则使用。@jarnbjo您能举个例子说明其中的差异吗?特定于语言环境的大小写规则至少适用于土耳其语和德语。土耳其语将带点和不带点的I视为两个不同的字母,创建小写/大写字母对Iİ和ıI,而其他语言将iI视为一对,不使用字母ı和İ。在德语中,小写字母ß大写为“SS”。注意:第二个两个语句可以组合以产生相同的结果:if(str1==null | | str2==null)return false;
。根据上面的注释,修改代码以使其更干净-这是漫长的一天:)如果(str1==str2)return true;
这两个字符串引用都指向同一个字符串对象,则还可以将第一行更改为。
HashMap<HashWrap, Object> map = new HashMap<HashWrap, Object>();
public boolean newEquals(String str1, String str2)
{
int len = str1.length();
int len1 = str2.length();
if(len==len1)
{
for(int i=0,j=0;i<str1.length();i++,j++)
{
if(str1.charAt(i)!=str2.charAt(j))
return false;
}`enter code here`
}
return true;
}
import java.lang.String; //contains equalsIgnoreCase()
/*
*
*/
String s1 = "Hello";
String s2 = "hello";
if (s1.equalsIgnoreCase(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}
import com.ibm.icu.text.Normalizer2;
// ...
public static boolean equalsIgnoreCase(CharSequence s, CharSequence t) {
Normalizer2 normalizer = Normalizer2.getNFKCCasefoldInstance();
return normalizer.normalize(s).equals(normalizer.normalize(t));
}
String brook = "flu\u0308ßchen";
String BROOK = "FLÜSSCHEN";
assert equalsIgnoreCase(brook, BROOK);
org.apache.commons.lang.StringUtils.equalsIgnoreCase(String, String)
org.apache.commons.lang3.StringUtils.equalsIgnoreCase(CharSequence, CharSequence)