内容简介:Comparable和Comparator兄弟俩长得是真像。但是,需要注意下,使用中它们还是有不少区别的。下面,就一探究竟吧。一、Comparator做过集合排序的童鞋应该知道,可以使用Collections.sort方法对集合进行排序。我们点进去Collections类源码里边,会发现sort有两个重载方法。一个只需传一个List参数,另一个需要传两个参数:List和Comparator。
Comparable和Comparator兄弟俩长得是真像。但是,需要注意下,使用中它们还是有不少区别的。下面,就一探究竟吧。
一、Comparator
做过集合 排序 的童鞋应该知道,可以使用Collections.sort方法对集合进行排序。我们点进去Collections类源码里边,会发现sort有两个重载方法。一个只需传一个List参数,另一个需要传两个参数:List和Comparator。
其实,这两种方法就对应了Comparable和Comparator的两种用法。我经常使用带两个参数的方法,即需要实现Comparator接口。
使用步骤:
- 定义待比较的实体类。
- 定义一个比较器,实现Comparator接口。
- 重写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);
测试结果和上面是一模一样的。
三、总结
- 它们出自不同的包,Comparator在 java.util 包下,Comparable在 java.lang 包下。
- Comparator 使用比较灵活,不需要修改实体类源码,但是需要实现一个比较器。
- Comparable 使用简单,但是对代码有侵入性,需要修改实体类源码。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Scala 中的集合(二):集合性能比较
- Scala 中的集合(二):集合性能比较
- 《面试知识,工作可待:集合篇》:Java 集合面试知识大全
- 如何对集合对象求合计,然后追加在该集合对象中
- MongoDB指南---14、特殊的索引和集合:固定集合、TTL索引、全文本索引
- 图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Imperfect C++中文版
威尔逊 / 荣耀、刘未鹏 / 人民邮电出版社 / 2006-1 / 75.0
汇集实用的C++编程解决方案,C++虽然是一门非凡的语言,但并不完美。Matthew Wilson使用C++十年有余,其间发现C++存在一些固有的限制,需要一些颇具技术性的工作进行弥补。本书不仅指出了C++的缺失,更为你编写健壮、灵活、高效、可维护的代码提供了实用的技术和工具。Wilson向你展示了如何克服C++的复杂性,穿越C++庞大的范式阵列。夺回对代码的控制权,从而获得更理想的结果。一起来看看 《Imperfect C++中文版》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
HTML 编码/解码
HTML 编码/解码