Java compareTo() 方法
compareTo() 方法用于两种方式的比较:
- 字符串与对象进行比较。
- 按字典顺序比较两个字符串。
语法:
int compareTo(Object o)//o -- 要比较的对象。
或
int compareTo(String anotherString)//anotherString -- 要比较的字符串。
返回值
返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的长度差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方结束。
- 如果参数字符串等于此字符串,则返回值 0;
- 如果此字符串小于字符串参数,则返回一个小于 0 的值;
- 如果此字符串大于字符串参数,则返回一个大于 0 的值。
public class Test {
public static void main(String args[]) {
String str1 = "Strings";
String str2 = "Strings";
String str3 = "Strings123";
int result = str1.compareTo( str2 );
System.out.println(result);
result = str2.compareTo( str3 );
System.out.println(result);
result = str3.compareTo( str1 );
System.out.println(result);
}
}
以上程序执行结果为:
0
-3
3
按照字典比较其实说的是比对ASCII码的值
其实这里说的不够明确,compareTo(String)方法中其实是从头开始,一个一个字符的比对原字符串和参数字符串中的字符,如果相同就下一个,直到字符出现不同(包括某一个字符串结束了)就计算这两个不同字符的ASCII码的差,作为返回值。(或是直到最后都相同就返回0)
也正是因为这样的计算才使得原字符串更长的时候(假设前几位相同的情况下),返回值会大于零(因为那一位是某个字符的ASCII码减去0,ASCII码都是正数),而原字符串更短的时候,返回值会小于0(那一位是0减去某个字符的ASCII码)。
但我们不要忽略了一种情况就是两个字符串虽然长度相等但是中间有字母不同:
String str1="abcde";
String str2="abdde";
str1.compareTo(str2);
这时的返回值是-1,即是c的ASCII码(99)减去了d的ASCII码(100)所得。
还有一种情况字符串前面的字符相同但字符串长度不同时返回字符串相差位数而并非 ASCII 码差值。
String str1 = "abc";
String str2 = "abcdef";
System.out.println(str1.compareTo( str2 ));
输出 -3。
关于这个方法,不管参数是对象还是字符串,最终要比较的都是两个字符串的不同,以下称调用方法那边的为原字符串,方法参数里的为参数字符串。
这个方法分为两种比较方式:
1、不同的字符在较短字符串长度之内时
返回值=原字符串与参数字符串中第一个不同字符相差的ASCII码值,为原减参。
例子如下:
String str1="javasdrip";
String str2="javdscript";
str1.compareTo(str2);
此时返回值为-3,是a的ASCII码(97)减去了d的ASCII码值(100)得到。
注意:只比较第一个不同的字符,后面的d和c也不一样但不会进行比较了。
2、不同的字符在较短字符串长度之外时
返回值=原字符串与参数字符串相差的字符个数,原字符串长度大时为正,反之为负。
例子如下:
String str1="java";
String str2="javascript";
str1.compareTo(str2);
此时返回值为-6,是str1相比str2少去的字符个数。
注意:此时只比较位数,而无关ASCII码值,并非是0的ASCII码值减去s的ASCII码值,在参数字符串前面字符和原字符串一样时,返回值就是两者相差的字符个数,即使改变后面的字符也不会影响到返回的值,比如String str2="java123$%^",此时结果仍是-6。
注:转载于https://www.runoob.com/java/java-string-compareto.html