jdk原文
compareTo()
public int compareTo(String anotherString)
按字典顺序比较两个字符串。 比较基于字符串中每个字符的Unicode值。 此String
对象表示的字符序列按字典顺序与参数字符串表示的字符序列进行比较。 如果此String
对象按字典顺序排在参数字符串之前,则结果为负整数。 如果此String
对象按字典顺序跟随参数字符串,则结果为正整数。 如果字符串相等,结果为零; compareTo
在equals(Object)方法返回0
完全返回true
。
这是词典排序的定义。 如果两个字符串不同,则它们在某个索引处具有不同的字符,这些字符串是两个字符串的有效索引,或者它们的长度不同,或者两者都有。 如果它们在一个或多个索引位置具有不同的字符,则令k为最小的索引; 然后,通过使用<
运算符确定其位置k处的字符具有较小值的字符串,按字典顺序排在另一个字符串之前。 在这种情况下, compareTo
返回两个字符串中位置k
处两个字符值的k
- 即值:
this.charAt(k)-anotherString.charAt(k)
如果没有它们不同的索引位置,那么较短的字符串按字典顺序排在较长的字符串之前。 在这种情况下, compareTo
返回字符串长度的差异 - 即值:
this.length()-anotherString.length()
解释
字典顺序
就是按abcd~xyz的顺序进行比较。
两字符串进行比较时,从下标索引为0开始比较,str1[0] 和 str2[0] 进行比较,str1[1] 和 str2[1] 进行比较,直至比出大小。
compareTo()
分为两种情况:
1. 两字符串存在相同索引下的值不同
2. 两字符串不存在相同索引下的值不同
两字符串存在相同索引下的值不同
其实比较的是ASCII值。
String str5 = "hello world";
String str6 = "aaa";
System.out.println(str5.charAt(0));
System.out.println(str6.charAt(0));
System.out.println(str5.charAt(0) - str6.charAt(0));
System.out.println(str5.compareTo(str6));
根据字典顺序比较,str5 和 str6 存在相同索引下的值不同的情况的最小索引为0,所以 str5.compareTo(str6) 的值等于 str5.charAt(0) - str6.charAt(0)。
两字符串不存在相同索引下的值不同
当两字符串不存在相同索引下的值不同的情况,即其中一串是另一串的子串时,调用 compareTo() 方法,会比较两字符串的长度,返回长度相减的值。
String str7 = "hello world";
String str8 = "hello";
System.out.println(str7.length());
System.out.println(str8.length());
System.out.println(str7.length() - str8.length());
System.out.println(str7.compareTo(str8));
System.out.println(str8.length() - str7.length());
System.out.println(str8.compareTo(str7));
参考:java jdk开发文档