如何让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对象的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); } 

你可以使用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; }