Java 中 Comparable 和 Comparator 比较
一、Comparable简介
Comparable是排序接口。若一个类实现了Comparable接口,就意味着**“该类支持排序”**。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器。
Comparable 定义
Comparable 接口仅仅只包括一个函数,它的定义如下:
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
说明:
假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。
说明 :
此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
public static void main(String[] args) {
// Collections -> sort 排序
ArrayList<String> list = new ArrayList<>();
list.add("China");
list.add("America");
list.add("England");
list.add("Thailand");
list.add("Korean");
list.add("Canada");
Collections.sort(list);
for (String name : list) {
System.out.println(name);
}
}
============================================================
Comparator 简介
Comparator 是比较器接口。
我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。
Comparator 定义
Comparator 接口仅仅只包括两个个函数,它的定义如下:
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
说明:
(01) 若一个类要实现Comparator接口:它一定要实现compareTo(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。
为什么可以不实现 equals(Object obj) 函数呢? 因为任何类,默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object,在Object.java中实现了equals(Object obj)函数;所以,其它所有的类也相当于都实现了该函数。
(02) int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
演示一 : Integer 类的自然排序为 从小到大
. 希望重新定义为 从大到小
// 接口 : 实现类实现接口, 就必须重写接口的中所有抽象方法.
public class MyComparator implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
/*
1. o1 和 o2 从小到大.
2. o2 和 o1 从大到小.
3. 结果为 0, 和原来的顺序一模一样. 不变.
*/
return o2 - o1;
}
}
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list, 88, 66, 99, 33, 55, 77, 22, 44);
System.out.println("list = " + list);
// new MyComparator() 比较器对象.
Collections.sort(list, new MyComparator());
System.out.println("list = " + list);
}
演示二 : String 类的自定排序为 从a~z
, 希望从 z~a
, 或者根据字符串的长度来排序
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Lindi");
list.add("Rose");
list.add("Mary");
list.add("Jack");
list.add("Ann");
list.add("Angel Baby");
list.add("Peter");
list.add("Hanmeimei");
list.add("CK");
// new Comparator(); 接口不能实例化. 因为缺少实现体.
// new Comparator() { } 这是接口的匿名实现类.
// new Comparator<String>() { 重写 compare 抽象方法 }
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
/*
自然排序 :
o1.compareTo(o2); 字典顺序 a~z
o2.compareTo(o1); 字典顺序 z~a
自定义排序 : 长度
o1.length() - o2.length(); 从短到长
o2.length() - o1.length(); 从长到短
说明 : 如果返回 0, 表示没有任何变化. 顺序不变.
*/
// 1. 排序规则一 : 先按照长度
int result = o1.length() - o2.length();
// 2. 如果 result 为 0, 说明长度一致, 按照规则二来排序.
if (result == 0) {
// 3. 排序规则二 : 字符串的字典顺序
result = o1.compareTo(o2);
}
return result;
}
} );
for (String name : list) {
System.out.println(name);
}
}
Comparator 和 Comparable 比较
Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
我们不难发现:Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
上一篇: 浅谈Java中的泛型类与泛型方法
下一篇: 初探Tomcat的架构设计
推荐阅读
-
Java中Integer.parseInt和Integer.valueOf,你还傻傻分不清吗?
-
微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
-
Vue.js中extend选项和delimiters选项的比较
-
Java中parseInt()和valueOf(),toString()的区别
-
Python中map和列表推导效率比较实例分析
-
【转载】C#中ArrayList集合类和List集合类的比较
-
Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别
-
转:Comparable vs Comparator in Java
-
Java中 equals 和 == 的比较
-
java中List对象的操作方法和List对象的遍历