目前我只认识到:
Comparable:一些类已经实现了该接口,实现该结构来实现内在排序。如sort排序。
Comparator:在TreeMap和TreeSet容器的构造器里会使用该类参数来实现容器内置排序,好像还有一些排序的函数使用该类参数。
对于自己的实现的类可以impletements Comparable来使用sort(Object[]o)函数或者构造一个实现comparator的类来使用Arrays.sort(Object[] o,Comparator c).大家来讨论一下,对它俩的区别和用法发表自己的看法。

解决方案 »

  1.   

    两个都是接口,功能差不多,不过好像comparator用得更多一点,通常用作排序的参数,comparable更多的只是由类来实现一下
      

  2.   

    comparable是通用的接口,用户可以实现它来完成自己特定的比较,而comparator可以看成一种算法的实现,在需要容器集合collection需要比较功能的时候,来指定这个比较器,这可以看出一种设计模式,将算法和数据分离,就像C++ STL中的函数对象一样。前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于“静态绑定”,而后者可以“动态绑定”。
      

  3.   

    因为Comparable不够用,所以有加了Comparator!
    事实上因为一个对象可以有多种排序方式,所以Comparable是不够的!
      

  4.   

    Comparator体现了设计模式的“策略模式”。
    比如Collections.sort(Object o, Comparator c)是用来排序的,但究竟根据什么排序,确切的是怎样定义数组(也可以是集合类对象)中元素的大小关系,比如a1为什么比a2大,这就需要你给它一个策略,而Comparator c就是你传给sort的排序策略。
      

  5.   

    implement Comparable
    只用写一个类函数Comparator
    要写一个类~
      

  6.   

    区别很简单一个类实现了Camparable接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用Sort方法排序了。而Comparator的作用有两个:
    1,如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过Comparator来实现比较算法进行排序
    2,为了使用不同的排序标准做准备,比如:升序、降序或其他什么序
    BTW,Comparator实际上是DP中的Strategy模式的典型应用。
      

  7.   

    其实有了Comparator,完全可以不用Comparable!
    因为Comparator是动态定义排序规则,Comparable是静态定义的。
      

  8.   

    其实有了Comparator,完全可以不用Comparable!如果你的类的对象是全序的,那么为他实现Comparable接口是一个编成道德的问题,这可以大大方便使用的是。所以,从这个角度来说Comparable是绝对必要的
      

  9.   

    这么多星星?
    我就不说了.
    总之:Comparator更灵活
      

  10.   

    看了大家的贴子受益匪浅!
    我觉得基本上已经讨论明白了:
    一:Comparable静态绑定在类上,只能有一种排序方式。
    二:Comparator通过方法动态绑定在类上,使用不同的实现Comparator的类就可以实现不同的排序方式,所以比较灵活。
    treeroot的话经典:
    “因为Comparable不够用,所以有加了Comparator!事实上因为一个对象可以有多种排序方式,所以Comparable是不够的!”
    Polarislee让我更加清晰明白了他们的用处。大家给我指正一下我的总结。同时大家讨论一下treeroot和Polarislee两位大侠分歧的地方:对于Comprable使用的必要性。谢谢大家了
      

  11.   

    我并没有说Comparable不需要,我只是说功能上可以不要,但是它提供了一种方便的方式。
    如果我只有一种排序方式(事实上多数情况是这样的),就没有必要使用Comparator了!
    可是Comparable可以带来方便,可以认为Comparator是Comparable的扩展!
    至少从兼容性考虑也不可能把Comparable去掉!