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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 皮卫凯 中级黑马   /  2012-9-15 22:11  /  1714 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 皮卫凯 于 2012-9-16 14:25 编辑

Comparable和Comparator是两个比较器,
equals()和hashCode()是判断是否相等。
  equals()是判断地址是否相等
  hashCode()是判断哈希值是否相等
那么比较器中一定要用到这两个方法么?

还有我查api的时候 发现util中只有
Comparator接口,没有Comparable接口?

11.png (3.49 KB, 下载次数: 27)

11.png

4 个回复

倒序浏览
Comparable & Comparator 都是用来实现集合中的排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。 具体请看 <Thinking   in   java> Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作)     而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。   可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。 用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。   比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。 java 代码:

    Copy code
    // AbsComparator.java     import   java.util.*;
public   class   AbsComparator   implements   Comparator  
{
         public   int   compare(Object   o1,   Object   o2)
   {
           int   v1   =   Math.abs(((Integer)o1).intValue());
           int   v2   =   Math.abs(((Integer)o2).intValue());
           return   v1   >   v2   ?   1   :   (v1   ==   v2   ?   0   :   -1);
         }   
}
        可以用下面这个类测试 AbsComparator:
    Copy code
    // Test.java     import   java.util.*;     public   class   Test
   {
         public   static   void   main(String[]   args)
   {
               //产生一个20个随机整数的数组(有正有负)
           Random   rnd   =   new   Random();
          Integer[]   integers   =   new   Integer[20];
           for(int   i   =   0;   i   <   integers.length;   i++)
           integers[i]   =   new   Integer(rnd.nextInt(100)   *   (rnd.nextBoolean()   ?   1   :   -1));
               System.out.println("用Integer内置方法排序:");
          Arrays.sort(integers);
           System.out.println(Arrays.asList(integers));
               System.out.println("用AbsComparator排序:");
          Arrays.sort(integers,   new   AbsComparator());
           System.out.println(Arrays.asList(integers));
        }
     }

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 回帖的时候,尽可能的简洁明了。看清问的问.

查看全部评分

回复 使用道具 举报
  通过hashCode()方法来判断对象的哈希值,根据哈希值把数据放入相应的位置如果该位置已经有元素存在,那么说明哈希值相等,则继续用equals()方法来判断 如果也相等那么证明是相同的元素,则不存,  
比较器覆盖的是覆盖compare方法 在方法里面比较

QQ截图20120915224549.jpg (16.76 KB, 下载次数: 26)

QQ截图20120915224549.jpg
回复 使用道具 举报
本帖最后由 武庆东 于 2012-9-16 14:18 编辑

楼主可能对两种比较器不是太清楚
1:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。
    也种方式也成为元素的自然顺序,或者叫做默认顺序。
class Student implements Comparable//该接口强制让学生类具备比较性
{  Student()
    {}
    public int compareTo(Object obj)
    {}
}

2:当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。
    在集合初始化时,就有了比较方式。
    这时就需要定义一个比较器类去实现Comparator,并重写compare方法。
class MyCompare implements Comparator  //自定义比较器,使集合具备比较性
{  public int compare(Object o1,Object o2)
    {}
}


在定义集合时,需要根据实际情况选择排序方式,一.treeset为例:
1、TreeSet ts =new TreeSet(); //此时的排序方式为第一种,即元素的自然排序方式。
2、TreeSet ts =new TreeSet(new MyCompare()); //此时的排序方式为第二种,即集合自身具备比较性。
综述:Comparator位于java.util下,Comparable则位于java.lang下
Comparable是一个对象本身就已经支持自比较的接口(如Sring、integer均可完成比较大小操作,已经实现了Comparable接口)
comparator是一个专用的比较器,当这个对象自比较或者自比较函数不能满足需求时,可以写一个比较器来完成两个对象之间大小的比较

在这里面不一定要用到equals()和hashcode()方法。





回复 使用道具 举报
武庆东 发表于 2012-9-15 22:52
楼主可能对两种比较器不是太清楚:
1:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo ...

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