我创建了一个 Java 程序来比较两个字符串:
String str = "Hello";
if (str.equals("hello")) {
System.out.println("match");
} else {
System.out.println("no match");
}
它区分大小写。我怎样才能改变它,使它不是?
我创建了一个 Java 程序来比较两个字符串:
String str = "Hello";
if (str.equals("hello")) {
System.out.println("match");
} else {
System.out.println("no match");
}
它区分大小写。我怎样才能改变它,使它不是?
最好的方法是使用str.equalsIgnoreCase("foo")
. 它专门为此目的进行了优化。
您还可以将两个字符串转换为大写或小写,然后再将它们与equals
. 对于其他可能没有equalsIgnoreCase
.
str.toUpperCase().equals(str2.toUpperCase())
如果您使用的是非罗马字母,请注意 JavaDoc 的这一部分,equalsIgnoreCase
其中说
请注意,此方法不考虑语言环境,并且会导致某些语言环境的结果不令人满意。Collat or 类提供了区域敏感的比较。
使用String.equalsIgnoreCase()
.
使用 Java API 参考来查找如下答案:
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
你必须使用对象的compareToIgnoreCase
方法String
。
int compareValue = str1.compareToIgnoreCase(str2);
if (compareValue == 0)
这意味着str1
等于str2
。
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
在默认的 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>();
请注意,您可能还想在执行 .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);
}
使用s1.equalsIgnoreCase(s2)
:https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String)。
您可以使用equalsIgnoreCase
为了安全,您可以使用
org.apache.commons.lang.StringUtils.equalsIgnoreCase(String, String)
或者
org.apache.commons.lang3.StringUtils.equalsIgnoreCase(CharSequence, CharSequence)
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;
}