java Comparator接口和Comparable接口的个人见解

相同点

这两个接口都是用来排序的,例如数组的方法Arrays.sort(),对集合进行排序的方法Collections.sort() 。

不同点

Comparable接口是用来给实现这个接口的类,自己排序,重点是给自己

Comparator接口是用来给其他类对象进行排序的,重点是给他人

Comparable例子

首先定义一个类实现了Comparable接口 ,类名叫Comparable_Example

package Sort;

public class Comparable_Example implements Comparable<Comparable_Example> {
    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    private int number;


    public Comparable_Example(int number) {
        this.number=number;
    }

    /**
     * @param o   就代表在排序时候,本身类的其他实例,将自身与其他实例进行比较
     * @return  返回正实数就是大于,0代表等于,负实数代表小于
     */
 @Override
    public int compareTo(Comparable_Example o) {
        return this.number-o.getNumber();
    }
}

再定义一个没有实现接口的普通类Normal

package Sort;

public class Normal {
    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    private int number;

    public Normal(int number) {
        this.number = number;
    }
}

接着在主函数里面创建数组,并添加数据,
首先用数组Arrays.sort()方法排序

        //首先是数组排序
        Comparable_Example[] comparable_examples=new Comparable_Example[10];
        //随机数 随机生成0到100的int值
        Random random=new Random();
        for (int i = 0; i <10 ; i++) {
              comparable_examples[i]=new Comparable_Example(random.nextInt(100));
        }
        //未排序前
        for (int i = 0; i <comparable_examples.length ; i++) {
            System.out.println(comparable_examples[i].getNumber());
        }
        System.out.println("排序后");
        Arrays.sort(comparable_examples);
        for (int i = 0; i <comparable_examples.length ; i++) {
            System.out.println(comparable_examples[i].getNumber());
        }

这里写图片描述

如果你对一个没有实现Comparable接口的类的数组,或者类的集合,也用Arrays.sort()方法则会抛出异常

Exception in thread "main" java.lang.ClassCastException: Sort.Normal cannot be cast to java.base/java.lang.Comparable
    at java.base/java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
    at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
    at java.base/java.util.Arrays.sort(Arrays.java:1248)
    at Sort.Sort.main(Sort.java:31)

如果是集合则用Collections.sort()方法

  List<Comparable_Example> comparable_exampleList=new ArrayList<Comparable_Example>();
        //随机数 随机生成0100的int值
        Random random=new Random();
        for (int i = 0; i <10 ; i++) {
           comparable_exampleList.add(new Comparable_Example(random.nextInt(100)));
        }
        System.out.println("集合排序后");
        Collections.sort(comparable_exampleList);
         comparable_exampleList.forEach(e-> System.out.println(e.getNumber()));
    }

运行结果
这里写图片描述

Comparator接口例子

直接上代码,对上个例子中的Normal类集合或数组进行排序

 List<Normal> normals=new ArrayList<Normal>();
        Random random=new Random();
        for (int i = 0; i <10 ; i++) {
            normals.add(new Normal(random.nextInt(100)));
        }

        //重点代码
        Collections.sort(normals, new Comparator<Normal>() {
            @Override
            public int compare(Normal o1, Normal o2) {
                return o1.getNumber()-o2.getNumber();
            }
        });
        System.out.println("排序后");
        normals.forEach(e-> System.out.println(e.getNumber()));
    }

这里写图片描述

上面那个也可以用Lambda表达式写

  Collections.sort(normals,((o1, o2) -> o1.getNumber()-o2.getNumber()));

如果你对Lambda表达式有疑问的话,可以参考我的Lambda教程

https://blog.csdn.net/a1064072510/article/details/80947286

猜你喜欢

转载自blog.csdn.net/a1064072510/article/details/80994111