【基础】Java中比较器接口的总结

18 篇文章 0 订阅
本文详细介绍了Java中的Comparable接口和Comparator接口在对象比较中的应用,包括Comparable接口的内联比较和Comparator接口的独立实现,以及各自的适用场景和优缺点。
摘要由CSDN通过智能技术生成

1,比较器的作用

Java代码中,我们不仅会对基本数据类型和引用数据类型做值的比较,经常也会需要对一个对象做比较。由此,就需要使用比较器接口来实现相关的比较功能了。

2,比较器接口的种类

2.1,Comparable接口

2.1.1,用法

// UserInfo.java
public class UserInfo implements Comparable<UserInfo> {
    private Integer userId;
    private Integer age;
    private String  name;
	// 省略了全参构造和Getter,Setter方法
    // 需要覆写toString方法

	// Comparable接口中需要重写的方法
    @Override
    public int compareTo(UserInfo o) {
        if (this.age - o.getAge() == 0) {
            return this.userId - o.getUserId();
        }
        return this.age - o.getAge();
    }
    
 // AppMain.java
 public class AppMain {
    public static void main(String[] args) {
        List<UserInfo> list = new ArrayList<>();
        list.add(new UserInfo(1,21,"迈凯伦P1"));
        list.add(new UserInfo(2,27,"宝马M2"));
        list.add(new UserInfo(3,15,"宝马M3"));
        list.add(new UserInfo(6,15,"宝马M4"));
        list.add(new UserInfo(5,24,"宝马M5"));
        list.add(new UserInfo(4,24,"奥迪RS6"));
        list.add(new UserInfo(7,21,"小米SU7"));

        Collections.sort(list);

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

// 输出结果
UserInfo{userId=3, age=15, name='宝马M3'}
UserInfo{userId=6, age=15, name='宝马M4'}
UserInfo{userId=1, age=21, name='迈凯伦P1'}
UserInfo{userId=7, age=21, name='小米SU7'}
UserInfo{userId=4, age=24, name='奥迪RS6'}
UserInfo{userId=5, age=24, name='宝马M5'}
UserInfo{userId=2, age=27, name='宝马M2'}

2.1.2,特征

比较器实现与对象类高度耦合

2.1.3,总结

在对象封装度较高的场景下,如果需要修改比较规则就会涉及到对象的修改。
Comparable比较器是在对象内部完成比较。

2.2,Comparator接口

2.2.1,用法

// UserInfo.java与上面相同,唯一区别是不需要实现任何接口
// MyComparator.java
public class MyComparator implements Comparator<UserInfo> {
    @Override
    public int compare(UserInfo o1, UserInfo o2) {
        if (o1.getAge() - o2.getAge() == 0) {
            return o1.getUserId() - o2.getUserId();
        }
        return o1.getAge() - o2.getAge();
    }
}
// AppMain.java
public class AppMain {
    public static void main(String[] args) {
        List<UserInfo> list = new ArrayList<>();
        list.add(new UserInfo(1,21,"迈凯伦P1"));
        list.add(new UserInfo(2,27,"宝马M2"));
        list.add(new UserInfo(3,15,"宝马M3"));
        list.add(new UserInfo(6,15,"宝马M4"));
        list.add(new UserInfo(5,24,"宝马M5"));
        list.add(new UserInfo(4,24,"奥迪RS6"));
        list.add(new UserInfo(7,21,"小米SU7"));
        MyComparator myComparator = new MyComparator();
        Collections.sort(list,myComparator);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}
// 输出结果
UserInfo{userId=3, age=15, name='宝马M3'}
UserInfo{userId=6, age=15, name='宝马M4'}
UserInfo{userId=1, age=21, name='迈凯伦P1'}
UserInfo{userId=7, age=21, name='小米SU7'}
UserInfo{userId=4, age=24, name='奥迪RS6'}
UserInfo{userId=5, age=24, name='宝马M5'}
UserInfo{userId=2, age=27, name='宝马M2'}

2.2.2,特征

比较器的实现是单独完成的,不与对象耦合

2.2.3,总结

如果对象没有实现Comparable接口,又想对两个类进行比较(或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意),那就可以实现Comparator接口,自定义比较器。
Comparator比较器是在对象外部完成比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值