加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Comparable和Comparator接口的区别

(2011-04-03 15:51:21)

原本打算写Comparable接口的实现问题的,看了之前汪志鹏同学关于Comparator接口的小结后,决定小改下内容。主要由于二者都是重写了老师上课提到的关于数组排序的Arrays.sort()方法的相应规则,又都是用来实现自定义对象数组的排序,我采用的是Comparable接口,所以拿来和汪同学的对比下,以显示二者之间的区别。

 

鉴于之前汪同学采用了DOG类,我下面写一个Comparable的接口实现类,同学们可以参照Comparator的先试着找找二者间的区别。

   //引入头文件
   import java.util.Arrays;
      //dog类的定义
   class Dog implements Comparable<Dog>{           //第一处不同,直接在需要比较类的后面实现接口
       private String name ;
       private int weight;
       private int height;
       public Dog(String name, int weight, int height) {
       this.name=name;
       this.weight = weight;
       this.height = height;
       }
       String getName(){
        return name;
       }
       public int getWeight() {
       return weight;
       }
       public void setWeight(int height) {
       this.weight = height;
       }

      public int compareTo(Dog d)           //第二处不同,在需要比较的类内直接重写接口方法

          if(this.weight>d.getWeight()  return  -1;

          if(this.weight<d.getWeight() ) return 1;

          else return 0;    }//这样改写实现的是降序排列,稍后分析
  

      之后主函数的实现参照汪同学的,现在申明第三处不同,调用的时候

     Comparator: Arrays.sort(dogs, new ByWeightComparator());

     Comparable: Arrays.sort(dogs);

 

下面补充一些关于Comparable的相关知识:

1、Comparable接口需要重写一个方法,即public int compareTo(Object o){};

2、同Comparator一样,它们实际都是通过改写某种规则来实现对象之间的比较,如此题中自定义的DOG类,通过比较WEIGHT来实现其整个对象数组的排列,而调用的方法都是Arrays.sort(),但要注意二者使用该方法的参数并不相同,较之书本例子Comparable可能更形象一些。

3、对升序降序的改写分析:返回负值的排前,返回正值的排后,为了把this这个当前对象大时排前,小时插后(即实现降序),比较时显然该在this大时返回负值,this小时返回正值。

 

再接下来我用小结描述下二者的不同:

1、Comparator在集合(即你要实现比较的类)外进行定义的实现,而Comparable接口则是在你要比较的类内进行方法的实现。这样看来Comparator更像是一个专用的比较器。

2、Comparator实现了算法和数据的分离,从代码也可以看出,其实这和第一点是相辅相成的,因为Comparable依赖于某一个需要比较的类来实现。

3、Comparable支持自比较,自比较是指比如String等类里面本身就有CompareTo()方法,直接就可以进行String类对象的比较,这也可以从较之Comparator,Comparable中Arrays.sort()方法中只带数组参数的形式与书上例子更相似这点看出。 

4、从第3点延伸,我们可以看到当不满足于自比较函数,如String类时,我们试图改写规则要怎么办——通过Comparator因为它支持外比较,它是分离的。

5、当一个又一个类设计完成后,或许我们最初没有设想到类的比较问题,而没使用Comparable接口,那我们之后可以通过Comparator来完成,而同时无需改变之前完成的类的构建。

6、运用Arrays.sort()方法时,注意二者的参数不同,Comparator多了一个参数,这第二个参数是使用Comparator接口的那个被视为专用比较器的类的对象,如汪同学例子中的new ByWeightComparator()。

 

 

其实大部分情况下我们并不需要刻意去对二者做选择,哪个用得顺手就用哪个,但当你的习惯遭遇某种问题时,这样的区别分析可以让你不妨换个方向思考,不至于走入死胡同。

以上分析多是个人理解,如有纰漏,还望加以修正。

                                                                          ——周雅 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有