共同学习Java源码--常用数据类型--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;

    }

这个方法重写的是Comparable接口的compareTo方法。首先获取两个字符串长度中最小的一个,然后进入循环比较每个字符串的char数组value的每个元素,其实比较的就是第一个不同的元素,如果两个字符串最小长度为0,那么直接返回两个字符串长度之差。

    public static final Comparator<String> CASE_INSENSITIVE_ORDER
                                         = new CaseInsensitiveComparator();

声明了一个Comparator成员变量,静态final的,采用多态机制,Comparator接口的实现类在下面实现。
    private static class CaseInsensitiveComparator
            implements Comparator<String>, java.io.Serializable {
        // use serialVersionUID from JDK 1.2.2 for interoperability
        private static final long serialVersionUID = 8575799808933029326L;


        public int compare(String s1, String s2) {
            int n1 = s1.length();
            int n2 = s2.length();
            int min = Math.min(n1, n2);
            for (int i = 0; i < min; i++) {
                char c1 = s1.charAt(i);
                char c2 = s2.charAt(i);
                if (c1 != c2) {
                    c1 = Character.toUpperCase(c1);
                    c2 = Character.toUpperCase(c2);
                    if (c1 != c2) {
                        c1 = Character.toLowerCase(c1);
                        c2 = Character.toLowerCase(c2);
                        if (c1 != c2) {
                            // No overflow because of numeric promotion
                            return c1 - c2;
                        }
                    }
                }
            }
            return n1 - n2;
        }


        /** Replaces the de-serialized object. */
        private Object readResolve() { return CASE_INSENSITIVE_ORDER; }
    }

声明一个静态私有内部类CaseInsensitiveComparator,重写了compare方法,compare方法和上面的compareTo方法类似都是获取两个字符串的长度,取最小值,进入循环,比较第一个不相等的字符,这里compare方法是先将第一个不相等字符都转换成大写,如果转换成大写还不相等,那就都转换成小写,转换成小写还不相等,则直接计算两个字符的差,如此多次转换的原因其实就在上一篇里,上一篇介绍的regionMatches方法中的注释说了,格鲁吉亚文字比较特别。。。这里就是应对特殊语言的情况,此处不做细说。这个内部类就是对大小写不敏感的情况进行排序。

这个内部类的最后一个方法是readResolve方法是为了保证反序列化后不破坏单例机制,此处不做具体说明。


你可能感兴趣的:(共同学习Java源码--常用数据类型--String(七))