如何使字符串比较不区分大小写?

时间:2010-02-08 08:50:14

标签: java string comparison case-insensitive

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

String s1 = "Hello";
String s2 = "hello";

if (s1.equals(s2)) {
    System.out.println("hai");
} else {
    System.out.println("welcome");
}

显示“欢迎”。我理解它区分大小写。但我的问题是我想要比较两个没有区分大小写的字符串。即我希望输出为hai

12 个答案:

答案 0 :(得分:162)

  • 最好使用s1.equalsIgnoreCase(s2) :(请参阅javadoc
  • 您也可以将它们转换为大写/小写并使用s1.equals(s2)

答案 1 :(得分:40)

答案 2 :(得分:22)

您必须使用compareToIgnoreCase对象的String方法。

int compareValue = str1.compareToIgnoreCase(str2);

if (compareValue == 0)表示str1等于str2

答案 3 :(得分:22)

对于幼稚的不区分大小写的字符串比较,

String.equalsIgnoreCase是最实用的选择。

但是,请注意,此方法既不执行完整的大小写折叠也不执行分解,因此无法执行Unicode标准中指定的无大小写匹配。实际上,JDK API不会提供对案例折叠字符数据的信息访问,因此这项工作最好委托给经过试验和测试的第三方库。

该库是ICU,以下是如何实现用于不区分大小写的字符串比较的实用程序:

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);

即使是这个简单的测试,与上限或下限字符串的String.equalsIgnoreCaseString.equals的天真比较也会失败。

(请注意,预定义的案例折叠风格getNFKCCasefoldInstance与区域设置无关;对于土耳其语区域设置,可能需要更多涉及UCharacter.foldCase的工作。)

答案 4 :(得分:10)

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");
}

现在它将输出:hai

答案 5 :(得分:4)

在默认的Java API中,您有:

String.CASE_INSENSITIVE_ORDER

因此,如果要使用带有Sorted数据结构的字符串,则不需要重写比较器。

String s = "some text here";
s.equalsIgnoreCase("Some text here");

您希望在自己的代码中进行纯粹的等式检查。

进一步了解有关Java中字符串相等性的任何信息。 java.lang.String类的hashCode()函数“区分大小写”:

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

因此,如果你想使用带有字符串的Hashtable / HashMap作为键,并且像“SomeKey”,“SOMEKEY”和“somekey”这样的键被视为相等,那么你必须将你的字符串包装在另一个类中(你不能扩展String,因为它是最后一个类)。例如:

private static class HashWrap {
    private final String value;
    private final int hash;

    public String get() {
        return value;
    }

    private HashWrap(String value) {
        this.value = value;
        String lc = value.toLowerCase();
        this.hash = lc.hashCode();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o instanceof HashWrap) {
            HashWrap that = (HashWrap) o;
            return value.equalsIgnoreCase(that.value);
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        return this.hash;
    }
}

然后使用它:

HashMap<HashWrap, Object> map = new HashMap<HashWrap, Object>();

答案 6 :(得分:2)

请注意,您可能希望在执行.equals或.equalsIgnoreCase之前对它们进行空检查。

null String对象不能调用equals方法。

即:

public boolean areStringsSame(String str1, String str2)
{
    if (str1 == null && str2 == null)
        return true;
    if (str1 == null || str2 == null)
        return false;

    return str1.equalsIgnoreCase(str2);
}

答案 7 :(得分:1)

答案 8 :(得分:1)

您可以使用equalsIgnoreCase

答案 9 :(得分:1)

有关字符串的更多信息,请参阅String ClassString Tutorials

答案 10 :(得分:-1)

要成为nullsafe,您可以使用

org.apache.commons.lang.StringUtils.equalsIgnoreCase(String, String)

org.apache.commons.lang3.StringUtils.equalsIgnoreCase(CharSequence, CharSequence)

答案 11 :(得分:-6)

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;
}