Comparable并且Comparator是通过Java核心API提供了两个接口。从它们的名称中,我们可以看出它们可能以某种方式用于比较对象。但是它们到底是什么,它们之间有什么区别?以下是回答此问题的两个示例。简单的示例比较两个HDTV的大小。阅读代码后,如何使用Comparable vs. Comparator很明显。

java 比较器 通用 java的比较器_java

1.可比

Comparable为了能够将自身的对象与某些其他对象进行比较,该类由类实现。类本身必须实现接口,以便能够比较其实例。实现所需的方法是compareTo()。这是一个例子:

java 比较器 通用 java的比较器_Java_02

Sony is better.

2.比较器

在某些情况下,您可能不想更改类并使其具有可比性。在这种情况下,Comparator如果要基于某些属性/字段比较对象,可以使用。例如,可以根据“身高”或“年龄”等对2个人进行比较(使用可比性无法做到)。

实现所需的方法是compare()。现在,让我们使用另一种方式来比较这些电视的尺寸。Comparator排序的一种常见用途是。无论Collections和Arrays类提供使用排序方法Comparator。

importjava.util.ArrayList;import java.util.Collections;import java.util.Comparator;
classHDTV {
classSizeComparator implements Comparator {
publicintcompare(HDTV tv1, HDTV tv2) {
inttv1Size = tv1.getSize();
inttv2Size = tv2.getSize();
if(tv1Size > tv2Size) {
} elseif(tv1Size < tv2Size) {
HDTV tv3 = newHDTV(42, "Panasonic");
ArrayList al = newArrayList();
al.add(tv1);
al.add(tv2);
al.add(tv3);
Collections.sort(al, newSizeComparator());
for(HDTV a : al) {
System.out.println(a.getBrand());

输出:

Panasonic
Samsung
Sony

通常,我们可能会使用Collections.reverseOrder()方法来获得降序比较器。如下所示:

java 比较器 通用 java的比较器_Java_03

[3,1,2]

[1,2,3]

[3,2,1]

3.何时使用哪个?

简而言之,实现的类Comparable将是可比较的,这意味着可以将其实例进行相互比较。

实现的类Comparator主要用于两种情况:1)可以将其传递给排序方法,例如Collections.sort()或Arrays.sort(),以精确控制排序顺序; 2)还可用于控制某些数据的顺序结构,例如排序集(例如TreeSet)或排序图(例如TreeMap)。

例如,创建一个TreeSet。我们可以将构造函数传递给比较器,也可以使对象类具有可比性。

方法1-TreeSet(比较器比较器)

classDog {
intsize;
Dog(ints) {
size = s;
classSizeComparator implements Comparator {
publicintcompare(Dog d1, Dog d2) {
returnd1.size - d2.size;
publicclassImpComparable {
TreeSet d = newTreeSet(new SizeComparator()); // pass comparator
d.add(newDog(1));
d.add(newDog(2));

方法2-实施可比性

java 比较器 通用 java的比较器_java_04