115

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

String str = "Hello";

if (str.equals("hello")) {
    System.out.println("match");
} else {
    System.out.println("no match");
}

它区分大小写。我怎样才能改变它,使它不是?

4

12 回答 12

182

最好的方法是使用str.equalsIgnoreCase("foo"). 它专门为此目的进行了优化。

您还可以将两个字符串转换为大写或小写,然后再将它们与equals. 对于其他可能没有equalsIgnoreCase.

str.toUpperCase().equals(str2.toUpperCase())

如果您使用的是非罗马字母,请注意 JavaDoc 的这一部分,equalsIgnoreCase其中说

请注意,此方法不考虑语言环境,并且会导致某些语言环境的结果不令人满意。Collat ​​or 类提供了区域敏感的比较。

于 2010-02-08T08:52:35.020 回答
44

使用String.equalsIgnoreCase().

使用 Java API 参考来查找如下答案:

https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String)

https://docs.oracle.com/javase/1.5.0/docs/api/

于 2010-02-08T08:52:20.730 回答
25

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.equalsIgnoreCase即使是这个简单的测试,与, 或大写或小写字符串的幼稚比较String.equals也会失败。

(请注意,预定义的大小写折叠风格与语言环境无关;对于土耳其语言环境,可能需要进行getNFKCCasefoldInstance更多工作。)UCharacter.foldCase

于 2016-01-23T16:56:06.257 回答
22

你必须使用对象的compareToIgnoreCase方法String

int compareValue = str1.compareToIgnoreCase(str2);

if (compareValue == 0)这意味着str1等于str2

于 2012-05-01T05:09:56.387 回答
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

于 2014-02-13T09:33:11.523 回答
5

在默认的 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”这样的键被视为相等,那么您将不得不将您的字符串包装在另一个类中(您不能扩展字符串,因为它是最终类)。例如 :

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>();
于 2013-08-21T13:36:14.533 回答
2

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

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

IE:

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);
}
于 2013-04-09T03:57:33.300 回答
2

使用s1.equalsIgnoreCase(s2)https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String)

于 2010-02-08T08:53:05.207 回答
1

更多关于字符串可以在字符串类字符串教程中找到

于 2010-02-08T08:57:05.343 回答
1

您可以使用equalsIgnoreCase

于 2010-02-08T08:53:43.223 回答
1

为了安全,您可以使用

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

或者

org.apache.commons.lang3.StringUtils.equalsIgnoreCase(CharSequence, CharSequence)
于 2017-09-12T12:34:39.930 回答
-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;
}
于 2013-11-15T05:28:14.997 回答