Java中的compareTo()
方法返回一个更大/相等/小于0的值,我知道这一点。但是,价值本身是我的问题。当compareTo()
返回时2或4之间有什么区别。查看下面的代码
String s1="hello";
String s2="hello";
String s3="meklo";
String s4="hemlo";
System.out.println(s1.compareTo(s2)); // 0
System.out.println(s1.compareTo(s3)); // -5
System.out.println(s1.compareTo(s4)); // -1
为什么最后两个命令为-5和-1?
这是词典顺序的定义。如果两个字符串是不同的,那么它们在某些索引上具有不同的字符,这是两个字符串的有效索引,或者它们的长度不同,或者两者都不同。如果他们在一个或多个索引位置上具有不同的字符,请k为最小的索引;然后通过使用&lt确定的位置k的字符的字符串具有较小的值;操作员,词典在另一个字符串之前。在这种情况下,CompareTo返回两个字符串中位置k处两个字符值的差 - 即值:
this.charat(k)-AnothersTring.Charat(k)
如果没有不同的索引位置,则较短的字符串词典在较长的字符串之前。在这种情况下,CompareTo返回字符串长度的差异 - 即值:
this.length()-AnotherString.length()
compareTo()
返回了两个字符串中第一个 trimbate 字符的差。如果找不到不匹配,并且一个字符串比其他字符串短,则返回长度差。
"hello".compareTo("meklo") = 'h' - 'm' = -5
^ ^
and
"hello".compareTo("hemlo") = 'l' - 'm' = -1
^ ^
作为旁注:非零值主要被视为条件语句内部的true
。因此,compareTo
可以简单地返回这些非零值,而不是将它们处理到1
(小优化)中。
如果您仔细查看String#compareTo(String)
的源代码,则可以看到确切的结果是模棱两可的。
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
在大多数情况下(即两个字符串字符的差异),它将返回第一个不同字符的char值的整数差异。否则,它将返回两个字符串的长度差。
在= 0
,> 0
和< 0
之外的返回值的解释在实践中不必担心,因为如果保留了Comparable<T>#compareTo(T)
的合同,则允许实施任何时间更改:
将此对象与指定的对象进行比较。返回一个负整数,零或正整数,因为该对象小于,等于或大于指定的对象。
来源:https://docs.oracle.com/javase/8/docs/api/java/java/lang/comparable.html#compareto-t-t-
确切的值无关紧要 - Comparable
(以及Comparator
)接口都关心的所有内容是值是负,零还是正面。
这是为了使事物用于实现接口。实施它时,您可以选择返回基本-1、0或1(如果比较依赖于评估某些条件,这是通常的),或者如果它更适合您,则可以使用任何任意负值或正值 - 例如您可以通过返回this.i - other.i
进行比较两个整数。
在您特定给定的例子中,我的猜测是:
-
-1
是第三个字母的代码点的差异:'l' - 'm' == -1
-
-5
在第一个字母的代码点中是差异:'h' - 'm' == -5
,但重要的部分是您不得依靠它是那样的 - 这是一个实施细节,根据Comparable
的合同,任何负值都应相同("小于")。