当使用compareto for strings时,总是返回10

Ail*_*Ail 2 java

比较不要给我-10更大的论点.(当字符串与参数相等时,我得到0).

    String str2 = "Strings are immutable";
    String str3 = "Int is a";

    int result = str3.compareTo( str2 );
    System.out.println(result);

    result = str2.compareTo( str3 );
    System.out.println(result);
Run Code Online (Sandbox Code Playgroud)

如果更改str2或str3的大小,则返回编号相同.这是为什么?

Era*_*ran 8

比较Strings时唯一可以依赖的compareTo是,如果你调用方法的String在另一个String之前(根据字典顺序),输出将是<0,如果它在另一个String之后,则输出> 0,如果它们相等则为0.

来自Javadoc:

int java.lang.String.compareTo(String anotherString)

按字典顺序比较两个字符串.比较基于字符串中每个字符的Unicode值.此String对象表示的字符序列按字典顺序与参数字符串表示的字符序列进行比较.如果此String对象按字典顺序位于参数字符串之前,则结果为负整数.如果此String对象按字典顺序跟随参数字符串,则结果为正整数.如果字符串相等,结果为零 ; compareTall在equals(Object)方法返回true时完全返回0.

您不应该对该方法返回的实际值做任何假设,因为这是一个实现细节,可以在任何未来版本的Java中更改.

Java 8实现碰巧返回到c1 - c2哪里c1并且c2是比较的字符串的第一对相应字符彼此不相等.如果一个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;
}
Run Code Online (Sandbox Code Playgroud)

在您的示例中,比较的Strings的第一个字符不同,因此str2.compareTo(str3)将返回str2.charAt(0)-str3.charAt(0),str3.compareTo(str2)并将返回str3.charAt(0)-str2.charAt(0).