Java comparable和Comparator接口的区别

时间:2022-07-19 02:50:21

初次学习java接口和集合框架,对里面的比较和排序,总是一知半解。今天查阅资料,加深了理解,总结如下。

1. Comparable接口可以说成是“自然比较器”,是标准类库中自带的比较器,很多类都实现了该接口,比如Integer、String等。该接口只提供一个方法:compareTo

Java comparable和Comparator接口的区别

实现了该接口的类,可以使用Arrays.sort()方法。

2. Comparator接口是外部比较器,该接口有很多方法。使用场景:当我们需要的比较规则,Comparable接口无法满足时,可以使用这个接口来实现自定义比较规则。

Arrays.sort()和TreeSet等类中就可以使用新定义的接口规则。

举例说明:

a. Integer实现了Comparable接口,但是比较规则是按实际值比较,如果需要按照别的规则对数值进行比较,例如,通过绝对值进行比较大小,则需要自定义比较器Comparator。

该段例子,引用自:http://blog.csdn.net/mageshuai/article/details/3849143

import java.util.Arrays;
import java.util.Comparator;
import java.util.Random;

/**
* comparator是外部比较器,comparable是内部比较器。
* 本例中,当integer的comparable接口的排序规则不是我们所需要的时候,通过实现comparator接口,完成用绝对值排序的算法。
* @author
*
*/

public class ComparatorVsComparableDemo implements Comparator<Integer>{
public int compare(Integer int1, Integer int2) {
int v1 = Math.abs(int1.intValue());
int v2 = Math.abs(int2.intValue());
return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
}
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(10) * (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 ComparatorVsComparableDemo());
System.out.println(Arrays.asList(integers));
}
}