A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王飚 中级黑马   /  2013-10-18 00:05  /  1582 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王飚 于 2013-10-21 13:11 编辑

求解接口Comparator和Comparable的区别(请详细些)?
我的理解是Comparator是用于自定义比较器,而Comparable多数是被其它实现类实现,也就是说定义在内部的比较器是实现Comparable,而自定义的比较器是实现Comparator中的compare(){}方法,不知道这样理解对吗?

评分

参与人数 1技术分 +1 收起 理由
黄文伯 + 1 很给力!

查看全部评分

5 个回复

倒序浏览
Comparator和Comparable都是接口。只是实现Comparable接口的对象说明自身具备比较的功能,String对象就是个很好的例子,比较的规则由对象本来定。Comparator的可以看作一个外在的比较工具,将两个对象放在这个工具内,进行比较,比较的规则是由Comparator而定的。

Comparator和Comparable是没有直接联系的。

当特定情况下需要比较强时,需要实现Comparator接口,如TreeSet(Comparator<? super E> comparator) 需要时,当不指定比较器时,那么对象就要实现Comparable(自身比较功能)接口。

点评

感谢  发表于 2013-10-18 12:09
回复 使用道具 举报
一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等

点评

见解独特  发表于 2013-10-18 12:09
回复 使用道具 举报
  1. package cn.temp;

  2. import java.util.Iterator;
  3. import java.util.Set;
  4. import java.util.TreeSet;

  5. /**
  6. * 求解接口Comparator和Comparable的区别(请详细些)?
  7. * @author Cuilitang
  8. *
  9. */

  10. public class Temp {
  11.         public static void main(String[] args) {
  12.                 Set<Student> treeset = new TreeSet<Student>();
  13.                 treeset.add(new Student(1,"张三"));
  14.                 treeset.add(new Student(2,"李四"));
  15.                 treeset.add(new Student(3,"王五"));
  16.                
  17.                 Iterator<Student> it = treeset.iterator();
  18.                 while(it.hasNext()){
  19.                         System.out.println(it.next());
  20.                 }
  21.         }

  22. }
  23. /*
  24. * 此程序中Student 对象被存储进treeset集合中,但是treeset集合自身并没有比较对象先后顺序的比较器这样就需要调用对象自身的比较器来进行比较。
  25. * Person是自定义对象,为了能有比较性必须的继承使对象有比较性特性的接口:Comparable,这种情况很常见,比如要想让对象能够序列化就需要实现Serializable。
  26. * TreeSet集合是有序的所以迭代出来的元素就是按照Student对象自身的比较器比较的结果.
  27. * 若想测试,可以修改一下Student类中的compareTo()试一试。
  28. */
  29. class Student implements Comparable<Student>{
  30.         int id;
  31.         String name;
  32.         Student(int id, String name){
  33.                 this.id = id;
  34.                 this.name = name;
  35.         }
  36.        
  37.         @Override
  38.         public int compareTo(Student s1) {           //Student类的自然排序
  39.                 // TODO Auto-generated method stub
  40.                 int x = s1.id - this.id;   //比较年龄
  41.                 int y = s1.name.compareTo(this.name);//比较年龄,String实现了Comparable接口,并重写了conpareTo方法
  42.                 return x == 0 ? y:x;
  43.         }
  44.        
  45.         @Override
  46.         public String toString(){
  47.                 return id + "+" + name +"\t";
  48.                
  49.         }
  50.        
  51. }
复制代码
  1. package cn.temp;

  2. import java.util.Comparator;
  3. import java.util.Iterator;
  4. import java.util.Set;
  5. import java.util.TreeSet;

  6. /**
  7. * 求解接口Comparator和Comparable的区别(请详细些)?
  8. * @author Cuilitang
  9. *
  10. */

  11. public class CopyOfTemp {
  12.         public static void main(String[] args) {
  13.                 Set<Teacher> treeset = new TreeSet<Teacher>(new MyComparetor());
  14.                 treeset.add(new Teacher(1,"张三"));
  15.                 treeset.add(new Teacher(2,"李四"));
  16.                 treeset.add(new Teacher(3,"王五"));
  17.                
  18.                 Iterator<Teacher> it = treeset.iterator();
  19.                 while(it.hasNext()){
  20.                         System.out.println(it.next());
  21.                 }
  22.         }

  23. }
  24.         class MyComparetor implements Comparator<Teacher>{       //集合的比较器

  25.                 @Override
  26.                 public int compare(Teacher t1, Teacher t2) {
  27.                         // TODO Auto-generated method stub
  28.                         int x = t1.id - t2.id;
  29.                         int y = t1.name.compareTo(t2.name);
  30.                         return x == 0 ? y:x;
  31.                 }
  32. }
  33. /*
  34. * 此程序中Teacher 对象被存储进treeset集合中.跟上个程序不同,treeset集合自身具有比较器(在new对象时候传入了MyComparetor对象)。
  35. * 这样就不再要求传入的对象必须自身具备比较性。
  36. * TreeSet集合迭代出来的元素就是按照MyComparetor比较器比较的结果.
  37. * 若想测试,可以修改一下MyComparetor类中的compare()试一试。
  38. */
  39. class Teacher{
  40.         int id;
  41.         String name;
  42.         Teacher(int id, String name){
  43.                 this.id = id;
  44.                 this.name = name;
  45.         }
  46.        
  47.         @Override
  48.         public String toString(){
  49.                 return id + "+" + name +"\t";
  50.                
  51.         }
  52.        
  53. }

  54. /**
  55. *综上所述,Compareable接口和Comparetor接口实现的都是比较功能,两者都可以通过重写方法来对对象的顺序进行比较。
  56. *但是它们的调用者不同,具体的比较的方法中接受的参数也不同。
  57. *Compareable是被一个对象调用去与通过参数传进来的另一个对象比较;Comparetor的应用场景到目前为止我所知道的就是在TreeSet集合中,对集合元素进行排序。
  58. *最后很重要的一点:在Treeset集合中,若是两个比较器同时出现Comparetor优先级高于Compareable。
  59. */
复制代码

评分

参与人数 1技术分 +2 收起 理由
黄文伯 + 2 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马