在JAVA提供的comparator接口中重写了equals方法,用comparator声明一个变量,调用equals方法,查看equals的出处也确实是comparator,可是这样一个抽象方法有什么用?能起到比较的作用?官方的解释是用来比较两个比较器的比较顺序是不是一样,有点不理解。
我用一个类继承了comparator,然后实例化了两个变量(或者说是比较器),声明用的comparator。调用equals方法返回的是false,变量本身自比返回的是true。
求大佬解释一下这个用法。

解决方案 »

  1.   


    comparator是比较类内容的大小,用于排序。equals如果不重写就是比较2个类的地址。
      

  2.   


    comparator是比较类内容的大小,用于排序。equals如果不重写就是比较2个类的地址。
    接口又不能实例化,这个接口的任何一个实现类的equals方法都来自于Object,实现类里面不重写的话,equals方法比较的就还是地址,而且排序并不需要重写equals方法,不管在比较器里面还是在要比较的对象类里。
      

  3.   


    你继承接口不就是实例化了。你到底要问啥问题,一会说比较器,一会说equals,这是2个东西。你先把你想说的组织一下再说。
      

  4.   

    equals用于判断两个对象的内容是否相同
    compare或者compareTo用于比较两个对象的大小
    两个对象,可以内容相同但大小不等,或者大小相等内容不同,这取决于你怎么重写方法
    比如两个对象“aaa”和“AAA”,你可以重写equals方法,让它们相同(也就是忽略大小写),但是同时你可以重写compare或compareTo方法,让“aaa”小于“AAA”,让升序排序的时候“aaa”排在“AAA”之前
      

  5.   

    问题简单点说就是为什么comparator接口要重写equals方法
      

  6.   


    你继承接口不就是实例化了。你到底要问啥问题,一会说比较器,一会说equals,这是2个东西。你先把你想说的组织一下再说。
    问题简单点说就是为什么comparator接口要重写equals方法
      

  7.   


    当下面的情况Comparator c1=new comp1();
    Comparator c2=new comp2();如果Comparator里没有equals方法的话c1.equals(c2);就会报错,就这么简单。
      

  8.   


    哪里有规定一定要重写equals了?
    本来equals方法也是comparator接口定义的方法,因为Object已经有了equals方法,所以可以不用实现equals方法
    比如public class Sample {
        public static void main(String[] args) {
            try {
                Comparator<String> c0 = new Comparator<String>() {//只需要实现compare方法,不需要实现equals
                    public int compare(String s1, String s2) {//第二个数据和第一个数据相等
                        return 0;
                    }
                };
                Comparator<String> c1 = new Comparator<String>() {
                    public int compare(String s1, String s2) {//第二个数据比第一个数据大
                        return 1;
                    }
                };
                Comparator<String> c2 = new Comparator<String>() {
                    public int compare(String s1, String s2) {//第二个数据比的第一个数据小
                        return -1;
                    }
                };
                System.out.println(c0.compare("abc", "def"));
                System.out.println(c1.compare("abc", "def"));
                System.out.println(c2.compare("abc", "def"));
                
                String[] s = {"abc", "def", "ghi", "jkl"}; //三个比较器的排序结果
                Arrays.sort(s, c0);
                System.out.println(Arrays.toString(s));
                Arrays.sort(s, c1);
                System.out.println(Arrays.toString(s));
                Arrays.sort(s, c2);
                System.out.println(Arrays.toString(s));
                
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }
      

  9.   

    楼主所说的意思是Comparator接口中为什么要有equals方法。
    因为Comparator接口中有equals方法,可以实现该接口equals方法的多态,没有的话只能用实例类的equals来比较。
    事实上因为实例类都是继承Object类,所以不重写就是用的Object的equals方法。
      

  10.   


    这里主要是强调equals方法的逻辑与Object的不同,也鼓励实现这个逻辑。API文档:
    Note that it is always safe not to override Object.equals(Object). However, overriding this method may, in some cases, improve performance by allowing programs to determine that two distinct comparators impose the same order.
    但我想很少的人会实现这个逻辑,也很难实现.