Comparable和Comparator兄弟俩长得是真像。但是,需要注意下,使用中它们还是有不少区别的。下面,就一探究竟吧。

一、Comparator

做过集合排序的童鞋应该知道,可以使用Collections.sort方法对集合进行排序。我们点进去Collections类源码里边,会发现sort有两个重载方法。一个只需传一个List参数,另一个需要传两个参数:List和Comparator。

其实,这两种方法就对应了Comparable和Comparator的两种用法。我经常使用带两个参数的方法,即需要实现Comparator接口。

使用步骤:

  1. 定义待比较的实体类。
  2. 定义一个比较器,实现Comparator接口。
  3. 重写compare方法。
//待比较的实体类
public class User{
private int age;
private String name; public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public User(int age, String name) {
this.age = age;
this.name = name;
} public User() { }
}
//比较器,实现Comparator接口
public class UserCompare implements Comparator<User> {
@Override
public int compare(User o1, User o2) {
return o1.getAge() - o2.getAge();
}
} public class CmpTest {
public static void main(String[] args) { User user1 = new User(20, "李四");
User user2 = new User(18, "张三");
User user3 = new User(23, "王五"); ArrayList<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(user2);
userList.add(user3); System.out.println("排序前");
for (User user : userList) {
System.out.println(user.getAge()+":"+user.getName());
}
Collections.sort(userList, new UserCompare()); //把比较器传进去
System.out.println("排序后");
for (User user : userList) {
System.out.println(user.getAge()+":"+user.getName());
}
}
}

打印结果如下:

排序前
20:李四
18:张三
23:王五
排序后
18:张三
20:李四
23:王五

可以看到,已经实现了集合中User对象按年龄升序排序。

二、Comparable

这种方式,需要修改User类,实现Comparable接口,然后重写compareTo方法。

public class User implements Comparable<User>{
private int age;
private String name; public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public User(int age, String name) {
this.age = age;
this.name = name;
} public User() { } @Override
public int compareTo(User o) {
return this.getAge() - o.getAge();
}
}

测试类中只需要修改一行代码

//原来的代码
Collections.sort(userList, new UserCompare());
//替换为
Collections.sort(userList);

测试结果和上面是一模一样的。

三、总结

  1. 它们出自不同的包,Comparator在 java.util 包下,Comparable在 java.lang 包下。
  2. Comparator 使用比较灵活,不需要修改实体类源码,但是需要实现一个比较器。
  3. Comparable 使用简单,但是对代码有侵入性,需要修改实体类源码。

最新文章

  1. js事件技巧方法整合
  2. webpack ---loader,plugin下载命令
  3. BZOJ4668: 冷战
  4. buildroot 添加ssh,以及使用stftp 服务
  5. C# RichTextBox 滚动条 滚动到最后一行
  6. 官网下载Spring dist
  7. leetcode算法刷题(五)——动态规划(三)
  8. zoj 3171 The Hidden 7&#39;s
  9. mysql_navicat_快捷键
  10. java中异常处理机制的简单原理
  11. IT职场经纬 |阿里web前端面试考题,你能答出来几个?
  12. HTML基础知识入门
  13. VIM的字符编码设置
  14. 2017-06-27(useradd usermod userdel 禁止普通用户登录)
  15. VUE2.0增删改查附编辑添加model(弹框)组件共用
  16. kafka--- consumer 消费消息
  17. 【Netty源码学习】BootStrap
  18. 2018-2019-20175307实验一《Java开发环境的熟悉》实验报告
  19. 新浪天气api
  20. 1,python 的基本数据类型

热门文章

  1. oracle函数 end
  2. Android 错误:IllegalStateException: Can not perform this action after onSaveInstanceState
  3. Top 10 open source projects of 2015
  4. H3C 路由器的作用
  5. 如何将为Android开发的AIR应用转移到SD卡
  6. hdu 1128 Self Numbers
  7. joinColumns和inverseJoinColumns的用法
  8. H3C ACL包过滤的局限性
  9. python基础七之copy
  10. H3C 多路径网络中环路产生过程(2)