如何让string比较不区分大小写?
我创build了一个Java程序来比较两个string:
String s1 = "Hello"; String s2 = "hello"; if (s1.equals(s2)) { System.out.println("hai"); } else { System.out.println("welcome"); }
它显示“欢迎”。 我明白这是区分大小写的。 但我的问题是,我想比较两个string,而不区分大小写。 即我希望输出是hai
。
- 最好使用
s1.equalsIgnoreCase(s2)
:(参见javadoc ) - 您也可以将它们转换为大写/小写,并使用
s1.equals(s2)
使用String.equalsIgnoreCase()
使用Java API参考find这样的答案。
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String);
你必须使用String
对象的compareToIgnoreCase
方法。
int compareValue = str1.compareToIgnoreCase(str2);
if (compareValue == 0)
表示str1
等于str2
。
对于不区分大小写的string比较, String.equalsIgnoreCase
是最实际的select。
但是,要注意这个方法既不能进行全面的折叠也不能进行分解,所以不能执行Unicode标准中规定的无格式匹配。 事实上,JDK API不提供有关大小写折叠字符数据的信息,所以这个工作最好委托给久经考验的第三方库。
该库是ICU ,下面是如何实现一个不区分大小写的string比较实用程序:
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
上或小写string将甚至失败,即使这个简单的testing。
(请注意,预定义的折叠风格getNFKCCasefoldInstance
是独立于语言环境的;对于土耳其语区域,可能需要更多涉及UCharacter.foldCase
工作。
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,则不需要重写比较器。
String s = "some text here"; s.equalsIgnoreCase("Some text here");
是你想要在你自己的代码中进行纯粹的平等检查。
只是为了进一步了解有关Java中string平等的任何信息。 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; }
所以如果你想使用一个带有Strings的Hashtable / HashMap作为键,并且像SomeKey这样的键,SKEKEY和Somekey被看作是相同的,那么你将不得不把你的string包装到另外一个类中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>();
请注意,在执行.equals或.equalsIgnoreCase之前,您可能还需要对它们进行空检查。
空的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); }
使用s1.equalsIgnoreCase(s2)
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.Object);
你可以使用equalsIgnoreCase
关于string的更多信息可以在String Class和String Tutorials中find
为了保持安全,你可以使用
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; }