补充知识(一)——Comparable && Comparator浅析

    在看Java容器框架的时候,看见了这两个接口,有些不明白,这两个接口的区别是什么,Java为什么会存在这两个类似的接口?从网上整理笔记如下。
  
  Comparable && Comparator接口都是用来比较大小的。

1、基本定义和使用场景
    
Comparable的接口定义:
package java.lang;
import java.util.*;
public interface Comparable<T> {  
    public int compareTo (T o);
}
   
  Comparator的接口定义:
package java.util;  
public interface Comparator<T> {  
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

     Comparable接口的作用是对实现它的每个类的对象进行排序,这个接口需要类本身去实现。
作用
  • 若一个类实现了Comparable接口,实现Comparable接口的类的对象的List列表(或者数组),可以通过Collections.sort()(或Arrays.sort() )进行排序。
  • 实现Comparable接口的类的对象 可以用作 “有序映射”(如SortedMap)中的键 或者 “有序集合(TreeSet)”中的元素,而不需要额外指定比较器。


     Comparator接口可以使用在以下场景:

  • 如果类是固定的的,无法修改该类自身,而且该类又是final的,无法实现Comparable接口,但是又需要对其排序,那么此时Comparator接口可以派上用场了。在类的外部使用Comparator接口。
  • 比如一个类已经实现了Comparable接口,但是由于需求,我们要进行另一种排序规则,而用不允许修改类本身,那么Comparator接口作为比较器派上了用场。

2、举例分析

Person1实现了Comparable接口的compareTo()方法,下面例子就可以使用Collections工具类对其按照写的年龄升序排序。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
* Person1实现了Comparable接口,用于类对象的排序
*/
public class Person1 implements Comparable<Person1>{
private String name ;
private int age ;

public Person1(String name, int age) {
    this . age = age;
    this . name = name;
}

@Override
public int compareTo(Person1 o) {
    //用年龄进行排序
    return this . age - o. age ;
}

@Override
public String toString() {
    return name + ": " + age ;
}

/**
* 测试代码
* @param args
*/
public static void main(String[] args) {
    Person1 p1 = new Person1( "张三" , 20 );
    Person1 p2 = new Person1( "李四" , 18 );
    Person1 p3 = new Person1( "王五" , 30 );

List<Person1> list = new ArrayList<>();
    list.add(p1);
    list.add(p2);
    list.add(p3);

    System. out .println(list);
    //使用Collections工具类,对list进行排序
    Collections. sort (list);
    System. out .println(list);
    }
}

运行结果

[张三: 20, 李四: 18, 王五: 30]
[李四: 18, 张三: 20, 王五: 30]

如果此时,我们需要对list进行降序排序,而又不允许修改原始类,那么该如何呢?

只需要将Collections.sort(list)代码改成如下:
Collections. sort (list, new Comparator<Person1>() {
    @Override
    public int compare(Person1 o1, Person1 o2) {
        return o2. age - o1. age ;
    }
});

运行结果

[张三: 20, 李四: 18, 王五: 30]
[王五: 30, 张三: 20, 李四: 18]

3、总结

  • Comparable接口是一个排序接口,若一个类实现了该接口,就意味着“该类支持排序”;
  • 而Comparator接口是一个比较器接口,若向控制某个类的排序方法(比如经常更改排序规则),可以建立一个该类的比较器进行排序。
  • 前者使用固定,与一个具体类绑定;而后者较为灵活,可以给不同需求的比较功能的类使用。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值