}
这个方法重写的是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方法是为了保证反序列化后不破坏单例机制,此处不做具体说明。