Comparable与Comparator

    xiaoxiao2023-10-12  161

        String类实现的是Comparable接口,它主要依赖与CompareTo方法来进行排序:

    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; }

    我们可以看出,String实现了compare方法是以长度较短的字符串为基准,逐个比较字符,如果相同位置字符相同,则比较下一个,如果不同则直接返回两格字符的码值之差。

        Comparable在Java中被称之为“内比较器”,它的比较完全依赖于compareTo()方法,入参为被比较的对象。之所称之为“内比较器”,我认为主要有两个原因,也是Comparable接口的特点:

    实现Comparable接口的对象可以自己跟自己比较,如: String string1 = " adc"; string1.compareTo(string1); Collections下的sort()方法和Arrays下的sort()可以对实现了Comparable的对象直接进行排序,它们的底层实现其实也是调用了compareTo()方法来进行比较。如: String[] strings = new String[3]; strings[0] = "bd"; strings[1] = "acc"; strings[2] = "c"; Arrays.sort(strings); 输出结果(默认按字典升序): acc bd c

        如果我们想改变一个对象的排序方式,或者是给一个本身没有排序功能的类(没有实现Comparable接口)添加指定排序方式进行排序,更或者是想换一种方式指定排序时就可以让类实现Comparator接口,所以很多人称Comparator为“外比较器”。如我们想按照字符串长度进行排序:

    public class Demo implements Comparator<String> { @Override public int compare(String str1, String str2) { //决定升序或者降序由此实现方式决定 return str2.length() - str1.length(); } public static void main(String[] args) { String[] strings = new String[3]; strings[0] = "bd"; strings[1] = "acc"; strings[2] = "c"; Arrays.sort(strings , new Demo()); for(String string : strings) System.out.println(string); } } 输出结果: acc bd c
    最新回复(0)