Comparable<T> 和 Comparator<T> 的区别

Comparable

package java.lang;
import java.util.*;
public interface Comparable<T> {
//函数式接口
    public int compareTo(T o);
}


 

首先它是在java.lang包下的

有一个 返回值为 int型的 抽象方法

compareTo(T o)

传入参数是一个泛型 在定义这个接口的时候可以传入类型

参数 o与自己比较的对象

实例

package com.mc.demo.compare;
//让这个类实现 Comparable 接口
public class User implements Comparable<User> {
    //用户姓名
    private String name;
    //年龄
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public int compareTo(User user1) {
        //如果自身年龄 大于 user1的年龄 输出大于0 等于输出0 小于输出负数
        return this.getAge() - user1.getAge();
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package com.mc.demo.compare;

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

public class ComparableTest {
    public static void main(String[] args) {
        User user1 = new User();
        user1.setAge(3);
        user1.setName("mc");
        User user2 = new User();
        user2.setAge(5);
        user2.setName("lmf");
        List<User> list = new ArrayList<>();
        list.add(user2);
        list.add(user1);
        System.out.println("排序前....");
        for(User u:list) {
            System.out.println(u);
        }
        Collections.sort(list);
        System.out.println("排序后....");
        for(User u:list){
            System.out.println(u);
        }
    }
}

运行结果

排序前....
User{name='lmf', age=5}
User{name='mc', age=3}
排序后....
User{name='mc', age=3}
User{name='lmf', age=5}

Comparator<T>

package java.util;

@FunctionalInterface
public interface Comparator<T> {


    //也是一个函数式接口
    int compare(T o1, T o2);

}

这个方法的作用是比较两个参数的顺序。返回负整数,零或正整数,因为第一个参数小于或等于或大于第二个参数。

参数 o1 -要比较的第一个元素 o2 要比较的第二个元素

1.首先comparator 在java.util包下

2.他也有一个抽象方法,不过需要传递两个对象

实例

package com.mc.demo.compare;
//让这个类实现 Comparable 接口
//public class User implements Comparable<User> {
public class User{
    //用户姓名
    private String name;
    //年龄
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

//    @Override
//    public int compareTo(User user1) {
//        //如果自身年龄 大于 user1的年龄 输出大于0 等于输出0 小于输出负数
//        return this.getAge() - user1.getAge();
//    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package com.mc.demo.compare;

import java.util.Arrays;
import java.util.Comparator;

public class ComparatorTest {
    public static void main(String[] args) {
        //使用lambad表达式实现一个Comparator的接口
        Comparator<User> comparator = (o1,o2)->{
            return o1.getAge()-o2.getAge();
        };
        User[] users = new User[2];
        User user1 = new User();
        user1.setAge(3);
        user1.setName("mc");
        User user2 = new User();
        user2.setAge(5);
        users[0] = user2;
        users[1] = user1;
        //排序前
        for(User u:users){
            System.out.println(u);
        }
        //排序后
        Arrays.sort(users,comparator);
        System.out.println("排序后..............");
        for(User u:users){
            System.out.println(u);
        }
    }
}

总结

1.首先Comparable 在java.lang包下,Comparator 在java.util包下

2.Comparable中的比较方法需要传递一个参数,而Comparator需要传递两个参数

3.如果一个类实现类Comparable接口,就意味着这个类支持排序。而Comparator相当于一个比较器,我们如果需要控制某个类的次序,可以建立一个该类的比较器来进行排序

4.两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值