天天看点

Comparable接口和Comparator接口区别

简单写下两种排序方法: 

Comparable接口和Comparator接口,两个都是用来实现集合中元素的比较、排序的,只是两个接口使用的方式有些区别: 

(1)、Comparable位于java.lang下。 

     接口中的方法有:   int   compareTo(Object obj) 

     Comparator位于java.util下 

     接口中的方法有两个: 

     Int  compare(Object obj1,Object obj2) 

     Boolean equals(Object obj) 

     因为Comparable位于java.lang下显然默认的是Comparable下的方法。 

(2)、Comparable是在集合内部定义的方法实现的排序 

     compareTo()方法是放在对象类里面的, 

     在集合内部现实 compareTo()的方法。 

    Comparator是在集合外部实现的排序, 

    compare()是放在比较对象的类外面的 

    需要在集合外定义 compare()的方法,也就是再写一个类,而且需要导入    java.util.Comparator类 

(3)、在集合中,Collections.sort();方法排序。 

     在数组中用 Arrays.sort();方法进行排序。 

(4)、自定义的类要加入List容器中后才能够排序,如果不指定Comparator,那么就实现 Comparable接口设定的排序方法即自然顺序排序。 

(5)、Comparator是一个专用的比较器,当这个对象不支持自比较函数或者自比较函数不能满足要求时,可以写一个比较器来完成两个对象之间大小的比较。 

(6)简单说;Comparable接口是一个对象本身已经支持自比较所需要实现的接口。 

      Comparator是一个另写一个外部类来实现的比较的接口。 

例如:Student类实现Comparable接口。按照先按照age 

进行排序,如果age相等时再按照name进行排序 

代码如下: 

public int compareTo(Student stu) { 

RuleBasedCollator collator = (RuleBasedCollator) Collator.getInstance(Locale.CHINA); 

// 根据元素的年龄排序从低到高,年龄相同时按照姓名排序从低到高 

  if(this.age<stu.getAge()){ 

return -1; 

   else if(this.age>stu.getAge()){ 

return 1; 

else{ 

        return collator.compare(this.getName(), stu.getName());

   } 

在main函数中,用Collections.sort()方法实现排序。 

   static List<Student> arr=new ArrayList<Student>(); 

   Student stu1=new Student(1,"张一",23,"北京"); 

   Student stu2=new Student(2,"王二",26,"河南"); 

   Student stu3=new Student(3,"李三",24,"山东"); 

   Student stu4=new Student(4,"张四",25,"北京"); 

   arr.add(stu1); 

   arr.add(stu2); 

   arr.add(stu3); 

   arr.add(stu4); 

   Collections.sort(arr);