comparable和comparative的区别,java中comparable接口与comparat
今天给各位分享comparable和comparative的区别的知识,其中也会对comparable和comparative的区别进行解释,如果能碰巧解决你现在面临的问题,别忘了关注皮肤病网,现在开始吧!
java中Comparable和Comparator两种比较器的区别
Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较逻辑。可以把Comparable理解为内部比较器,而Comparator是外部比较器,基本的写法如下 class Apple implements Comparable{ int id; double price; public Apple(int id, double price) { this.id = id; this.price = price; } public int compareTo(Apple o) { return Double.compare(this.getPrice(),o.getPrice()); if (Math.abs(this.price-o.price)0.001) return 0; else return (o.price-this.price)0?1:-1; } @Override public String toString() { return Apple{ + id= + id + , price= + price + }; } } class AESComparator implements Comparator{ public int compare(Apple o1, Apple o2) { if (Math.abs(o1.price-o2.price)0.001) return 0; else{ return (o1.price-o2.price)0?1:-1; } } } 实现了Comparable接口的类需要实现compareTo()方法,传入一个外部参数进行比对,实现了Comparator接口的方法需要实现compare()方法,对外部传入的两个类进行比较,从而让外部方法在比较时调用。 两者的区别是实现Comparator接口代码更加灵活,可以定义某个类的多个比较器,从而在排序时根据实际场景自由调用,而Comparable接口实现后便不能改动。两种接口的调用方式如下 class AESComparator implements Comparator{ public int compare(Apple o1, Apple o2) { if (Math.abs(o1.price-o2.price)0.001) return 0; else{ return (o1.price-o2.price)0?1:-1; } } } class DESComparator implements Comparator{ public int compare(Apple o1, Apple o2) { if (Math.abs(o1.price-o2.price)0.001) return 0; else { return (o1.price-o2.price)0?-1:1; } } } public static void main(String[] args) { Apple apple1 = new Apple(1,4.8); Apple apple2 = new Apple(2,5.9); Apple apple3 = new Apple(3,8.5); List list = new ArrayList(); list.add(apple1); list.add(apple3); list.add(apple2); System.out.println(Comparable==========); System.out.printf(this list of apples: %sn,list); Collections.sort(list); System.out.printf(this list of apples: %sn,list); System.out.println(Comparator==========); System.out.printf(this list of apples: %sn,list); Collections.sort(list,new DESComparator()); System.out.printf(this list of apples: %sn,list); Collections.sort(list,new AESComparator()); System.out.printf(this list of apples: %sn,list); } } 上述代码存在的问题,不能在比较器中进行double类型的减法操作,因为对于值比较大的double,减法操作容易导致值的溢出,java7对每一种包装类型的比较新增了compare()方法,改造后的代码如下 class Apple implements Comparable{ int id; double price; public Apple(int id, double price) { this.id = id; this.price = price; } public int compareTo(Apple o) { return Double.compare(this.price,o.price); } @Override public String toString() { return Apple{ + id= + id + , price= + price + }; } } class AESComparator implements Comparator{ public int compare(Apple o1, Apple o2) { return Double.compare(o1.price,o2.price); } } class DESComparator implements Comparator{ public int compare(Apple o1, Apple o2) { return Double.compare(o2.price,o1.price); } } 查看Double.compare的源码如下 public static int compare(double d1, double d2) { if (d1 d2) return -1; Neither val is NaN, thisVal is smaller if (d1 d2) return 1; Neither val is NaN, thisVal is larger Cannot use doubleToRawLongBits because of possibility of NaNs. long thisBits = Double.doubleToLongBits(d1); long anotherBits = Double.doubleToLongBits(d2); return (thisBits == anotherBits ? 0 : Values are equal (thisBits anotherBits ? -1 : (-0.0, 0.0) or (!NaN, NaN) 1)); (0.0, -0.0) or (NaN, !NaN) }
Java中,如果想要排序,实现Comparator接口 与Comparable 的区别?
comparator接口与Comparable接口的区别 1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的, 什么是自定义class: 如 public class Person{ String name; int age }. 当我们有这么一个personList,里面包含了person1, person2, persion3....., 我们用Collections.sort( personList ), 是得不到预期的结果的. 这时肯定有人要问, 那为什么可以排序一个字符串list呢: 如 StringList{hello1 , hello3 , hello2}, Collections.sort( stringList ) 能够得到正确的排序, 那是因为 String 这个对象已经帮我们实现了 Comparable接口 , 所以我们的 Person 如果想排序, 也要实现一个比较器。 2. Comparator 和 Comparable 的区别 Comparable Comparable 定义在 Person类的内部: public class Persion implements Comparable {..比较Person的大小..}, 因为已经实现了比较器,那么我们的Person现在是一个可以比较大小的对象了,它的比较功能和String完全一样,可以随时随地的拿来比较大小,因为Person现在自身就是有大小之分的。Collections.sort(personList)可以得到正确的结果。 Comparator Comparator 是定义在Person的外部的, 此时我们的Person类的结构不需要有任何变化,如 public class Person{ String name; int age }, 然后我们定义一个比较器: public PersonComparator implements Comparator() {..比较Person的大小..}, 在PersonComparator里面实现了怎么比较两个Person的大小. 所以,用这种方法,当我们要对一个 personList进行排序的时候, 我们除了了要传递personList过去, 还需要把PersonComparator传递过去,因为怎么比较Person的大小是在PersonComparator里面实现的, 如: Collections.sort( personList , new PersonComparator() ). 3. Comparator 和 Comparable 的实例 Comparable: 实现Comparable接口要覆盖compareTo方法, 在compareTo方法里面实现比较 public class Person implements Comparable { String name; int age public int compareTo(Person another) { int i = 0; i = name.compareTo(another.name); 使用字符串的比较 if(i == 0) { 如果名字一样,比较年龄, 返回比较年龄结果 return age - another.age; } else { return i; 名字不一样, 返回比较名字的结果. } } } 这时我们可以直接用 Collections.sort( personList ) 对其排序了. Comparator: 实现Comparator需要覆盖 compare 方法 public class Person{ String name; int age } class PersonComparator implements Comparator { public int compare(Person one, Person another) { int i = 0; i = one.name.compareTo(another.name); 使用字符串的比较 if(i == 0) { 如果名字一样,比较年龄,返回比较年龄结果 return one.age - another.age; } else { return i; 名字不一样, 返回比较名字的结果. } } } Collections.sort( personList , new PersonComparator()) 可以对其排序 4: 两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
comparable和comparator的区别
1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的, 什么是自定义class: 如 public class Person{ String name; int age }. 当我们有这么一个personList,里面包含了person1, person2, persion3....., 我们用Collections.sort( personList ), 是得不到预期的结果的. 这时肯定有人要问, 那为什么可以排序一个字符串list呢: 如 StringList{hello1 , hello3 , hello2}, Collections.sort( stringList ) 能够得到正确的排序, 那是因为 String 这个对象已经帮我们实现了 Comparable接口 , 所以我们的 Person 如果想排序, 也要实现一个比较器。 2. Comparator 和 Comparable 的区别 Comparable Comparable 定义在 Person类的内部: public class Persion implements Comparable {..比较Person的大小..}, 因为已经实现了比较器,那么我们的Person现在是一个可以比较大小的对象了,它的比较功能和String完全一样,可以随时随地的拿来 比较大小,因为Person现在自身就是有大小之分的。Collections.sort(personList)可以得到正确的结果。 Comparator Comparator 是定义在Person的外部的, 此时我们的Person类的结构不需要有任何变化,如 public class Person{ String name; int age }, 然后我们定义一个比较器:
Comparable和Comparator接口是干什么的?它们的区别是什么?
Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。 Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。
comparable和comparator的区别
1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的, 什么是自定义class: 如 public class Person{ String name; int age }. 当我们有这么一个personList,里面包含了person1, person2, persion3....., 我们用Collections.sort( personList ), 是得不到预期的结果的. 这时肯定有人要问, 那为什么可以排序一个字符串list呢: 如 StringList{hello1 , hello3 , hello2}, Collections.sort( stringList ) 能够得到正确的排序, 那是因为 String 这个对象已经帮我们实现了 Comparable接口 , 所以我们的 Person 如果想排序, 也要实现一个比较器。 2. Comparator 和 Comparable 的区别 Comparable Comparable 定义在 Person类的内部: public class Persion implements Comparable {..比较Person的大小..}, 因为已经实现了比较器,那么我们的Person现在是一个可以比较大小的对象了,它的比较功能和String完全一样,可以随时随地的拿来 比较大小,因为Person现在自身就是有大小之分的。Collections.sort(personList)可以得到正确的结果。 Comparator Comparator 是定义在Person的外部的, 此时我们的Person类的结构不需要有任何变化,如 public class Person{ String name; int age }, 然后我们定义一个比较器:
好了,本文到此结束,希望对大家有所帮助。