String类中的compareTo方法

String类的定义:

java.lang
类 String

java.lang.Object
  java.lang.String

所有已实现的接口:
    Serializable, CharSequence, Comparable<String>

 

public final class String

extends Objectimplements Serializable, Comparable<String>, CharSequence

String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

例如:

         String str = "abc";


     

等效于:

 

        char data[] = {'a', 'b', 'c'};
         String str = new String(data);

 

 

再来看看String类中的compareTo方法:

具体解释如下:
compareTo

public int compareTo(String anotherString)

    按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。按字典顺序将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0;compareTo 只在方法 equals(Object) 返回 true 时才返回 0。

    这是字典排序的定义。如果这两个字符串不同,那么它们要么在某个索引处的字符不同(该索引对二者均为有效索引),要么长度不同,或者同时具备这两种情况。如果它们在一个或多个索引位置上的字符不同,假设 k 是这类索引的最小值;则在位置 k 上具有较小值的那个字符串(使用 < 运算符确定),其字典顺序在其他字符串之前。在这种情况下,compareTo 返回这两个字符串在位置 k 处两个char 值的差,即值:

        

 this.charAt(k)-anotherString.charAt(k)


         

    如果没有字符不同的索引位置,则较短字符串的字典顺序在较长字符串之前。在这种情况下,compareTo 返回这两个字符串长度的差,即值:

        

 this.length()-anotherString.length()


         

    指定者:
        接口 Comparable<String> 中的 compareTo

    参数:
        anotherString - 要比较的 String。
    返回:
        如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。

 

 

 N多的类中都有该compareTo方法,根本原因是因为它们都实现了接口comparable接口,并且实现了接口中的compareTo方法。

如下所示:

public interface Comparable<T>

此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。

实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

对于类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2) == 0 与 e1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals 一致。注意,null 不是任何类的实例,即使 e.equals(null) 返回 false,e.compareTo(null) 也将抛出 NullPointerException。

实际上,所有实现 Comparable 的 Java 核心类都具有与 equals 一致的自然排序。java.math.BigDecimal 是个例外,它的自然排序将值相等但精确度不同的 BigDecimal 对象(比如 4.0 和 4.00)视为相等。

 

 说了这么多,我们来看一下String类中是如何实现compareTo方法的:

 

    /* @param   anotherString   the <code>String</code> to be compared.
     * @return  the value <code>0</code> if the argument string is equal to
     *          this string; a value less than <code>0</code> if this string
     *          is lexicographically less than the string argument; and a
     *          value greater than <code>0</code> if this string is
     *          lexicographically greater than the string argument.
     */
    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;
    }


 由源码可以看出:

     首先取出两个字符串的长度,比较较小的长度内,两者是否相等。

          若不相等,则直接返回该位置字符的ASCII码相减后的值。

          若各位置都相等,则将两个字符串长度的差值返回。


(转自 温柔狠角色)
 

### 回答1: StringcompareTo方法是用来比较两个字符串的大小关系的。它返回一个整数值,表示两个字符串的大小关系。 如果两个字符串相等,返回;如果当前字符串小于另一个字符串,返回一个负整数;如果当前字符串大于另一个字符串,返回一个正整数。 比较的规则是按照字典序进行比较,即从左到右依次比较每个字符的Unicode值。如果当前字符的Unicode值小于另一个字符串对应位置的字符的Unicode值,则当前字符串小于另一个字符串;如果当前字符的Unicode值大于另一个字符串对应位置的字符的Unicode值,则当前字符串大于另一个字符串;如果两个字符的Unicode值相等,则继续比较下一个字符,直到比较完所有字符或者出现不相等的字符为止。 ### 回答2: string是Java中用来处理字符串的。在string类中有一个compareto方法,用来比较两个字符串的大小关系。 compareto方法的返回值是一个整型值,它表示了两个字符串的大小关系。如果两个字符串相等,返回值为0;如果第一个字符串比第二个字符串小,则返回值是负数;如果第一个字符串比第二个字符串大,则返回值是正数。具体说来,可以根据ASCll码对字符串中的每个字符进行比较。如果字符串中的某个字符的ASCll码不同,则按照它们的ASCll码大小来比较。 当使用compareto方法比较两个字符串的时候,需要注意以下几点: 1. 该方法是大小写敏感的,所以大写字母和小写字母视为不同的字符。 2. 字符串的比较顺序是从左到右,一旦在某个位置上发现两个字符不同,就停止比较。因此,在字符串中字符的位置非常重要。 3. 该方法只比较字符串的内容,不考虑字符串的长度和其他因素。 比如,可以使用compareto方法来比较两个字符串的大小关系: String str1 = "abcd"; String str2 = "abdf"; int result = str1.compareTo(str2); if(result < 0) System.out.println("str1小于str2"); else if(result > 0) System.out.println("str1大于str2"); else System.out.println("str1等于str2"); 在这个例子中,str1和str2都是字符串,使用compareto方法比较它们的大小关系。因为第四个字符不同,所以按照ASCII码比较,'c'的码值比'd'小1,从而str1比str2小1。因此,该示例程序输出“str1小于str2”。 ### 回答3: string是Java中一个非常常用的,它提供了很多操作字符串的方法,其中包括了compareTo方法compareTo方法是用来比较当前字符串对象与指定字符串对象的字典顺序大小的。字典顺序就是按照字母表依次比较每一个字符的大小。如果字符串相等,返回值为0;如果当前字符串对象比指定字符串对象小,返回值小于0,否则返回值大于0。 compareTo方法原型如下: public int compareTo(String anotherString) compareTo方法接收一个字符串参数,表示要与当前字符串对象进行比较的字符串。调用该方法的字符串对象称为原字符串,传入的字符串对象称为比较字符串。 具体的比较过程如下: 1. 如果原字符串等于比较字符串,返回0。 2. 如果原字符串小于比较字符串,返回一个小于0的值,注意这里的小于不是最简单的数值大小比较,而是按字符的ASCII码进行比较的。 3. 如果原字符串大于比较字符串,返回一个大于0的值,同样地,这里的大于也是按照字符的ASCII码进行比较的。 一个简单的比较示例: String s1 = "abc"; String s2 = "efg"; String s3 = "abc"; System.out.println(s1.compareTo(s2)); // 输出负整数,因为abc小于efg System.out.println(s1.compareTo(s3)); // 输出0,因为abc等于abc System.out.println(s2.compareTo(s1)); // 输出正整数,因为efg大于abc 除了常规的字典顺序比较之外,compareTo方法还可以用于对数字字符串进行大小比较。比如: String num1 = "123"; String num2 = "234"; System.out.println(num1.compareTo(num2)); // 输出负整数,因为123小于234 需要注意的是,如果字符串中包含非数字字符,会抛出NumberFormatException异常。因此,使用compareTo方法比较数字字符串时,需要确保字符串中只包含数字字符。 总之,compareTo方法是一个非常实用的字符串比较方法,可以用于任何需要比较字符串大小的场合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值