我是Java的初学者,可能我在问一些显而易见的事情,但无论如何。
根据 Java.Lang.String compareTo() 方法说明:
比较基于字符串中每个字符的 Unicode 值。
我正在比较字符串
public void compareString() {
String str1 = "test-2014";
String str2 = "test195519-9022c72bc161";
String str3 = "test200101-ee4d99b1492c";
String str4 = "test212941-884e3f03fe1e";
System.out.println(str1.compareTo(str2));
System.out.println(str1.compareTo(str3));
System.out.println(str1.compareTo(str4));
}
------------ OUTPUT -----------
-4
-5
-5
我希望输出在所有三种情况下都是相同的,因为每种情况下 (1, 2, 2) 中第五个字符的 Unicode 值都大于"str1"(-) 中的第五个字符。
你能解释一下为什么会这样吗?
认为
返回哪个负数并不重要。 这里唯一重要的信息是compareTo
返回的标志。 它是否返回-1
、-4
、-5
或-1000000
都无关紧要。 唯一要得出结论的是,str1
小于其他每个字符串。
来自 Javadocs 中Comparable
年compareTo
方法:
将此对象与指定的对象进行比较以进行排序。返回负整数、零或正整数,因为此对象小于、等于或大于指定对象。
你期望以下内容
我希望在所有三种情况下输出都是相同的,因为 在每种情况下 (1, 2, 2) 中第五个字符的 Unicode 值都大于 "str1"(-)中的第五个字符。
这种期望是错误的。-
的 unicode 值小于其他值。
运行此测试
System.out.println((int) '-');
System.out.println((int) '1');
System.out.println((int) '2');
它将打印
45
49
50
45 小于 49,因此该方法将返回负值。正如javadoc所说
如果参数字符串等于此字符串,则值 0;一个值 如果此字符串在字典顺序上小于字符串,则小于 0 论点;如果此字符串是 字典顺序大于字符串参数。
作为参考,Java Oracle 7 中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; // important!!!!
}
k++;
}
return len1 - len2;
}
没有任何地方说compareTo()
应该返回不匹配的第一个字符的索引。这是您的错误假设。唯一保证的结果是其返回值将为负、正或零,具体取决于两个字符串的字典顺序比较。
在这 3 种可能性中的每一种中,返回的实际数字(-5 对 -1 对 -3495582)取决于实现(实现可以自由返回它想要的任何内容,只要它是负数),你不应该对此做出进一步的假设。