【转】:浅析 Comparable和 Comparator的区别

简介
Comparable和 Comparator都是java.util包下的两个接口,从字面上看这两个接口都是用来做比较用的,但是jdk里面不可能定义两个功能相同的接口,所以他们肯定有不同的用处。

1、Comparable
1.1 说明
Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些 类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。compareTo方法的返回值是int,有三种情况:

1.2 举例
1.定义一个Girl.java类,实现Comparable接口,并且重写compareTo方法:默认比较的是当前Girl类,通过age属性进行比较。

public class Girl implements Comparable<Object> {

private String name;
private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Girl(String name, int age) {
super();
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Girl [name=" + name + ", age=" + age + "]";
}

@Override
public int compareTo(Object o) {
Girl g = (Girl)o;
return this.age - g.getAge();
}

}
2.定义测试类Test.java,定义一个ArrayList保存75个Girl,打乱顺序后(因为List本身是有序的),查看输出结果。代码如下:

public static void main(String[] args) {

List<Girl> list = new ArrayList<>(100);
Girl girl;
for (int i=0; i<75; i++) {
girl = new Girl("girl " + i, i);
list.add(girl);
}
Collections.shuffle(list);
list.stream().forEach(System.out::println);

}

输出结果:
Girl [name=girl 9, age=9]
Girl [name=girl 60, age=60]
Girl [name=girl 26, age=26]
Girl [name=girl 55, age=55]
Girl [name=girl 12, age=12]
Girl [name=girl 31, age=31]
Girl [name=girl 49, age=49]
Girl [name=girl 6, age=6]

输出是乱序的

3、还是2中的方法,只不过添加一行代码:使用Collections的sort(T t)方法排序。

public static void main(String[] args) {

List<Girl> list = new ArrayList<>(100);
Girl girl;
for (int i=0; i<75; i++) {
girl = new Girl("girl " + i, i);
list.add(girl);
}
Collections.shuffle(list);
Collections.sort(list);
list.stream().forEach(System.out::println);

}

输出结果:
Girl [name=girl 0, age=0]
Girl [name=girl 1, age=1]
Girl [name=girl 2, age=2]
Girl [name=girl 3, age=3]
Girl [name=girl 4, age=4]
Girl [name=girl 5, age=5]
Girl [name=girl 6, age=6]
Girl [name=girl 7, age=7]
Girl [name=girl 8, age=8]
Girl [name=girl 9, age=9]
Girl [name=girl 10, age=10]
Girl [name=girl 11, age=11]

输出是有序的,并且是按compareTo方法中定义的根据age的升序比较。

2、Comparator
2.1 说明
Comparator可以认为是是一个外比较器,个人认为有两种情况可以使用实现Comparator接口的方式:
1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较。
2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式。
Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种情况:

1、o1大于o2,返回正整数
2、o1等于o2,返回0
3、o1小于o3,返回负整数

2.2 举例
1.定义一个Girl.java类如下:

public class Girl {

private String name;
private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Girl(String name, int age) {
super();
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Girl [name=" + name + ", age=" + age + "]";
}

}

2.定义GirlComparator.java类,实现Comparator接口,重写compare()方法,和前面一样根据age进行比较。

public class GirlComparator implements Comparator<Girl> {

@Override
public int compare(Girl g1, Girl g2) {
return g1.getAge() - g2.getAge();
}

}

2.定义测试类Test.java,定义一个TreeSet保存75个Girl,查看输出结果。代码如下:

public static void main(String[] args) {

Set<Girl> set = new TreeSet<>();
Girl girl;
for (int i = 0; i< 75; i++) {
girl = new Girl("girl "+i, i);
set.add(girl);
}
set.stream().forEach(System.out::println);

}

输出结果:
Girl [name=girl 0, age=0]
Girl [name=girl 1, age=1]
Girl [name=girl 2, age=2]
Girl [name=girl 3, age=3]
Girl [name=girl 4, age=4]
Girl [name=girl 5, age=5]
Girl [name=girl 6, age=6]
Girl [name=girl 7, age=7]
Girl [name=girl 8, age=8]
Girl [name=girl 9, age=9]
Girl [name=girl 10, age=10]
Girl [name=girl 11, age=11]
Girl [name=girl 12, age=12]

输出是有序的,并且是按compare方法中定义的根据age的升序比较。

3、总结
总结一下,这两种比较器Comparable和Comparator,后者相比前者有如下优点:

个性化比较:如果实现类没有实现Comparable接口,又想对两个类进行比较(或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意),那么可以实现Comparator接口,自定义一个比较器,写比较算法。
解耦:实现Comparable接口的方式比实现Comparator接口的耦合性要强一些,如果要修改比较算法,要修改Comparable接口的实现类,而实现Comparator的类是在外部进行比较的,不需要对实现类有任何修改。从这个角度说,其实有些不太好,尤其在我们将实现类的.class文件打成一个.jar文件提供给开发者使用的时候。
---------------------
作者:Tony.Wu
来源:CSDN
原文:https://blog.csdn.net/wlh2015/article/details/83959462
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/xt-Corrine/p/10597315.html

时间: 2024-10-11 20:54:04

【转】:浅析 Comparable和 Comparator的区别的相关文章

Comparable和Comparator的区别

原文地址:http://leihuang.org/2014/11/16/Comparable-Vs-Comparator/ Comparable和Comparator都是用来实现集合中元素的比较.排序的,只是Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法. Comparator位于包java.util下,而Comparab

Java中Comparable和Comparator接口区别分析

Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧.Comparable 简介Comparable 是排序接口.若一个类实现了Comparab 本文要来详细分析一下Java中Comparable和Comparator接口的区别,

Java 解惑:Comparable 和 Comparator 的区别

读完本文你将了解到: Comparable 自然排序 Comparator 定制排序 总结 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下. Comparable 自然排序 Comparable 在 java.lang 包下,是一个接口,内部只有一个方法 compareTo(): public interface Comparable<T> { public int compareTo(T o); } Comparab

【Java基础】接口Comparable和Comparator的区别和关系

接口Comparable和Comparator的区别和关系 1).两者都是实现集合中元素的比较.排序: 2).Comparable是集合内部定义方法实现排序,Comparator是集合外部实现排序 3).Comparator接口在java.util下,Comparable接口在java.lang下; 通常自定义类加入如List等容器中能够排序,可以实现Comparable接口,在用Collections.sort(List<T> list, Comparator<? super T>

Java中Comparable与Comparator的区别

相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都是Java的接口 区别 Comparator位于java.util包下,而Comparable位于java.lang包下 Comparable接口的实现是在类的内部(如 String.Integer已经实现了Comparable接口,自己就可以完成比较大小操作),Comparator接口的实现是在类

Comparable和Comparator的区别?

一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序. Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用: 1.类的没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身 2.可以使用多种排序标准,比如升序.降序等 Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Com

Comparable与Comparator的区别

Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法. Comparator位于包java.util下,而Comparable位于包   java.lang下 Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 St

Java学习之Comparable与Comparator的区别

Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法.Comparator位于包java.util下,而Comparable位于包   java.lang下Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 Stri

Comparable 与 Comparator的区别

Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法. Comparator位于包java.util下,而Comparable位于包 java.lang下 Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 Stri