Java字符串比较
Java字符串比较意味着按字典顺序检查哪个字符串先出现。
有时需要比较两个字符串,以便可以对字符串集合进行排序。
例如,对学生姓名进行排序,以便可以按顺序将其发布并看起来不错。
Java字符串比较
比较两种字符串有五种方法。
- 使用==运算符
- 使用equals()方法
- 使用compareTo()方法
- 使用compareToIgnoreCase()方法
- 使用
java.text.Collator
compare()方法
使用==运算符的Java字符串比较
当使用double equals运算符比较两个对象时,当它们引用相同的对象时,它返回" true",否则返回" false"。
让我们看一些使用==在Java中进行字符串比较的代码段。
String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); System.out.println(s1 == s2); //true System.out.println(s1 == s3); //false s3 = s3.intern(); System.out.println(s1 == s3); //true
我们知道,当使用双引号创建字符串文字时,它们将进入字符串池。
所以s1和s2实际上是指字符串池中的同一对象,因此s1 == s2将返回true。
使用new运算符创建字符串时,将在堆空间中创建它。
所以s1和s2指的是不同的对象,因此s1 == s3将返回false。
接下来,当我们在s3上调用intern()
方法时,它将从字符串池中返回具有相同值的引用。
由于字符串池中已经有" abc",因此s3也获得相同的引用。
因此,最终," s1 == s3"将返回" true"。
Java字符串比较使用equals()方法
请注意,String是不可变的类,因此将它们与==运算符进行比较没有任何意义。
当我们试图比较两个字符串的值是否相等时,最好使用" equals()"方法。
如果要检查是否区分大小写,请使用equalsIgnoreCase()
方法。
下面的代码片段显示了使用equals()和equalsIgnoreCase()方法进行字符串比较的示例。
String s1 = "abc"; String s2 = "abc"; String s3 = new String("ABC"); System.out.println(s1.equals(s2)); //true System.out.println(s1.equals(s3)); //false System.out.println(s1.equalsIgnoreCase(s3)); //true
使用compareTo()方法的Java字符串比较
有时我们不想检查是否相等,而是对按字典顺序排在最前面的字符串感兴趣。
当我们要按字典中出现的顺序对字符串集合进行排序时,这一点很重要。
Java String类实现Comparable接口,并且使用compareTo()方法将字符串实例与另一个字符串进行比较。
如果此字符串在传递的参数之前,则返回负整数,否则返回正整数。
当两个字符串相等时,字符串compareTo()方法将返回0。
比较是基于字符串中每个字符的Unicode值。
如果两个字符串不同,那么它们或者在某个索引处具有不同的字符(这是两个字符串的有效索引),或者它们的长度不同,或者两者都不同。
假设索引" n"是字符不同的地方,那么compareTo()将返回" this.charAt(n)-argumentString.charAt(n)"。
如果没有索引位置不同,则按字典顺序,较短的字符串在较长的字符串之前。
在这种情况下,compareTo()方法返回字符串长度的差,即" this.length()-argumentString.length()"。
我们来看看一些使用compareTo()方法进行Java字符串比较的代码段。
String str = "ABC"; System.out.println(str.compareTo("DEF")); //-3 (Integer.valueOf('A') - Integer.valueOf('D')) System.out.println(str.compareTo("ABC")); //0 (equal string) System.out.println(str.compareTo("abc")); //-32 (Integer.valueOf('A') - Integer.valueOf('a')) System.out.println(str.compareTo("AB")); //1 (difference in length)
使用compareToIgnoreCase()方法的Java字符串比较
Java字符串compareToIgnoreCase()方法与compareTo()方法类似,但是会忽略这种情况。
让我们看一个简单的示例,我们将比较用户提供的两个输入字符串。
package com.theitroad.string; import java.util.Scanner; public class JavaStringCompare { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter First String:"); String first = sc.nextLine(); System.out.println("Enter Second String:"); String second = sc.nextLine(); sc.close(); System.out.println(first.compareTo(second)); System.out.println(first.compareToIgnoreCase(second)); } }
下图显示了上述字符串比较程序的执行输出。
使用Collator类的Java字符串比较
对于特定于语言环境的比较,我们应该使用java.text.Collator
类。
整理器最重要的功能是能够定义我们自己的自定义比较规则。
让我们看一个使用整理器进行字符串比较的简单示例。
package com.theitroad.string; import java.text.Collator; import java.text.ParseException; import java.text.RuleBasedCollator; import java.util.Locale; public class JavaCollatorExample { public static void main(String[] args) throws ParseException { Collator collator = Collator.getInstance(); Collator collatorFR = Collator.getInstance(Locale.FRANCE); System.out.println(collator.compare("X", "Z")); //-1 System.out.println(collatorFR.compare("X", "Z")); //-1 String rules = "< Z < X"; RuleBasedCollator rbc = new RuleBasedCollator(rules); System.out.println(rbc.compare("X", "Z")); //1 } }
注意," <Z <X"指定一个自定义规则,即Z排在X之前,而不是自然排序规则。
这就是为什么输出在上一次比较中发生了变化。