一个Java中关于Comparable和comparator的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个Java中关于Comparable和comparator的问题相关的知识,希望对你有一定的参考价值。
请问在java中comparable和comparator的关系是不是就是类似于iterable和iterator的关系啊?comparable这个接口下有哪些方法啊?comparator这个方法又是用来干什么的呢?
comparable接口只有一个方法:int compareTo(T o)(位于java.lang包下),主要作用是比较两个对象的大小。而Comparator<T>接口位于java.util包下,他有两个方法: int compare(T o1, T o2) 和boolean equals(Object obj) ,它的作用主要是用在集合的排序中(指定排序规则),强行对某个对象 collection 进行整体排序 的比较函数,也可用在Arrays的sort(Comparator c)方法中。 参考技术A Comparable与Comparator的区别:
http://hi.baidu.com/halu126/item/3d4e3901bfb2a1f0a0103420
Iterator和Iterable的区别:
http://hi.baidu.com/halu126/item/14d20ca8a7300b268919d3b4
Comparable和Comparator兄弟情深?
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 使用简单,但是对代码有侵入性,需要修改实体类源码。
以上是关于一个Java中关于Comparable和comparator的问题的主要内容,如果未能解决你的问题,请参考以下文章
Java学习之Comparable与Comparator的区别