Java字符串比较

时间:2020-02-23 14:36:54  来源:igfitidea点击:

Java字符串比较意味着按字典顺序检查哪个字符串先出现。
有时需要比较两个字符串,以便可以对字符串集合进行排序。
例如,对学生姓名进行排序,以便可以按顺序将其发布并看起来不错。

Java字符串比较

比较两种字符串有五种方法。

  • 使用==运算符
  • 使用equals()方法
  • 使用compareTo()方法
  • 使用compareToIgnoreCase()方法
  • 使用java.text.Collatorcompare()方法

使用==运算符的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之前,而不是自然排序规则。
这就是为什么输出在上一次比较中发生了变化。