"xyz".compareTo("abc")--->23
"abc".compareTo("xyz")--->-23
我需要知道它是如何计算这个数值的。这个值的用途是什么
请查看源代码并浏览文档,其中说按字典顺序比较两个字符串。比较基于字符串中每个字符的 Unicode 值。
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;
}
情况1: "xyz".compareTo("abc")
应返回'x'-'a'
等于 23。
案例二: "abc".compareTo("xyz")
应返回'a'-'x'
等于 -23。
值的大小无关紧要,通常不应依赖。的确切值已记录在案String.compareTo
,但我认为这本身就是一个设计错误。这不像可以以任何明智的方式使用差异,并且它限制了以后仍然可以遵守合同Comparable
但具有不同细节的实现:((完全指定的事实String.hashCode
是一个类似的错误。)
对于排序比较而言,重要的是值是小于 0、0 还是大于 0。
来自以下文档Comparable.compareTo
:
返回:
负整数、零或正整数,因为此对象小于、等于或大于指定对象。
compareTo 值仅指结果的符号 + 表示大于参数 xyz > abc - 表示小于参数 abc < xyz 0 表示它们相等。
由于字符串包含字符,字符串的 compareTo 使用字典顺序并将其转换为数字,但这只是实现。
"xyz".compareTo("abc")--->23
这需要返回一个正整数。在这种情况下,它返回 'x'-'a',即 23。
"abc".compareTo("xyz")--->-23
这是返回负整数所必需的。在这种情况下,它返回 'a'-'x',即 -23。
相似地
"abc".compareTo("abc")---> 0
这需要返回零。在这种情况下,它将返回 'a'-'a',它是零。
您可以看到使用减法是实现合约的最简单方法。
除了其他答案:如果您想执行本地敏感字符串比较而不是按字典顺序进行比较(例如,对于自然语言文本),请查看Collator和CollationKey。