集合排序Comparable和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 使用简单,但是对代码有侵入性,需要修改实体类源码。
集合排序Comparable和Comparator有什么区别?的更多相关文章
- java比较排序Comparable和Comparator
1 比较排序Comparable和Comparator 1.1 接口作用说明 Comparable和Comparator都是用来实现对象的比较.排序,对比时需要实现Compara ...
- Java集合(一)--Comparable和Comparator
Comparable: 是集合内部的方法实现的排序,只有一个方法 public interface Comparable<T> { public int compareTo(T o); } ...
- 【Java】Comparable和Comparator接口的区别
Java提供了只包含一个compareTo()方法的Comparable接口.这个方法可以个给两个对象排序.具体来说,它返回负数,0,正数来表明已经存在的对象小于,等于,大于输入对象. Java提供了 ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- Comparable和Comparator的区别&Collections.sort的两种用法
在Java集合的学习中,我们明白了: 看到tree,可以按顺序进行排列,就要想到两个接口.Comparable(集合中元素实现这个接口,元素自身具备可比性),Comparator(比较器,传入容器构造 ...
- 集合排序 Comparator和Comparable的使用区别
Java 排序 Compare Comparator接口 Comparable接口 区别 在Java中使用集合来存储数据时非常常见的,集合排序功能也是常用功能之一.下面看一下如何进行集合排序,常用的 ...
- Java集合排序方法comparable和comparator的总结
一.概述Comparable和Comparator都是用来实现集合中元素的比较.排序的.Comparable是在集合内部定义的方法实现的排序,位于java.lang下.Comparator是在集合外部 ...
- Java中Comparable和Comparator区别小结
一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...
- Java.lang.Comparable接口和Java.util.Comparator接口的区别
Java的Comparator和Comparable当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 1.Com ...
随机推荐
- python 实现A*算法
A*作为最常用的路径搜索算法,值得我们去深刻的研究.路径规划项目.先看一下维基百科给的算法解释:https://en.wikipedia.org/wiki/A*_search_algorithm A ...
- 【hiho一下 第147周】小Hi的烦恼
[题目链接]:http://hihocoder.com/contest/hiho147/problem/1 [题意] [题解] bitset的应用; 设better[j][i]表示第j个科目排名为1. ...
- behavior planning——11 create a cost function speed penalty
A key part of getting transitions to happen when we want them to is the design of reasonable cost ...
- Layer(Web弹窗)
Layer弹窗的用法: <script src="jQuery的路径"></script> <!-- 你必须先引入jQuery1.8或以上版本 --& ...
- oracle用UNION替换OR (适用于索引列)
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你 ...
- jq杂项方法/工具方法----isArray()
https://www.cnblogs.com/sandraryan/ $.isArray()函数用于判断指定参数是否是一个数组.返回布尔值. <!DOCTYPE html> <ht ...
- html5 canvas 3d屏保 源码
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...
- Python--day69--pythonDjango终端打印SQL语句、在Python脚本中调用Django环境
Django终端打印SQL语句 在Django项目的settings.py文件中,在最后复制粘贴如下代码: LOGGING = { 'version': 1, 'disable_existing_lo ...
- Python--day25--接口类
接口类,起规范作用
- H3C NAT Server