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

我创建了一个Java程序来比较两个字符串:

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问题的基本原理。@OhadSchneider
equalsIgnoreCase
为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)