比较不同情况时 compareTo 的用处

Usefulness of compareTo when comparing different case

String class实现了Comparable接口,可以看出结果是两个字符串的字典序差异,有道理:

String s1 = "AB";
String s2 = "AF";
  
System.out.println(s1.compareTo(s2)); 

将输出 -4,而如果我们切换参数输出 4.

不明白的是比较不同大小写的字符串,:

String s1 = "Ac";
String s2 = "AD";
  
System.out.println(s1.compareTo(s2)); 

这将输出 31 它只是根据 ASCII table 告诉我字符串中前两个不同字符之间的差异,它告诉我 "Ac" 大于 "AD" 来自 31.

现在,我知道这可以通过自定义比较器轻松解决,无论如何我看不出默认比较器给出的结果有什么用,它的目的是什么?

当我比较字符串时,我通常只想知道它们是否相等,如果一个比另一个大,无论它们是大写还是小写,我通常只想知道它们是否相等,默认情况下比较不区分大小写不是更好吗?

默认区分大小写的比较器 如果您恰好想要这种行为,那么它很有用:两个字符串之间区分大小写的比较。事实上,Ac 在字典序上比 AD 大。如果要不区分大小写的比较,则使用String#compareToIgnoreCase,例如:

String s1 = "Ac";
String s2 = "AD";

System.out.println(s1.compareToIgnoreCase(s2));  // -1 => Ac < AD, ignoring case

Comparable 的合同而言,compareTo 返回的实际数字并不重要。不是为了“有用”,而是为了它的标志。

唯一相关的是该值与零的比较方式(> 0== 0< 0)。换句话说,不要指望实际返回的数字,它可能会随着实现版本而改变(不违反合同)。老实说,如果我发现自己使用的是 Comparable 合约之外的返回值,我肯定会闻到代码的味道。

如果你想要始终相同的数字,你可以使用结果的符号:

System.out.println(Math.signum(s1.compareTo(s2))) //cast if needed

根据结果总是会产生-1.00.01.0,您可以放心。