Java中Comparable接口和Comparator接口的实现

 更新时间:2025年09月29日 09:09:13   作者:烫烫烫烫烫,,  
本文主要介绍了Java中Comparable接口和Comparator接口的实现,Comparable在类内定义比较逻辑,侵入性强;Comparator作为独立类,侵入性弱,支持灵活排序规则,两者均可用于对象比较,但适用场景不同,下面就来详细的介绍有一下

前言

Java中基本数据类型可以直接比较大小,但引用类型呢?同时引用对象中可能存在多个可比较的字段,那么我们该怎么比较呢?

Java中引用类型不能直接进行大小的比较,这种行为在编译器看来是危险的,所以会编译失败;
想要实现引用类型的比较,那么我们可以实现Comparable接口和Comparator接口

1 Comparable接口

Comparable接口是JDK提供的泛型比较接口类,源码实现大概如下:

//<T>中写比较的类
public interface Comparable<T> {
	//返回值
	// < 0,表示this指向的对象小于o指向的对象
	// > 0,表示this指向的对象大于o指向的对象
	// == 0,表示this指向的对象等于o指向的对象
	int compareTo(T o);
}

通常对于用户自定义类型,如果想要按照大小进行比较,那么我们需要在定义类的时候实现Comparable接口,并重写compareTo方法。

//存在一个Person类,根据年龄比较大小
public class Person implements Comparable<Person> {
	public String name;
	public int age;

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

	//重写compareTo方法
	int compareTo(Person o) {
		if(o == null) {
			return 1;
		}
		return this.age - o.age;
	}
}

//Main.java
public class Main {
	public static void main(String[] args) {
		Person person1 = new Person("lisi",18);
		Person person2 = new Person("wangwu",35);

		//比较person1和person2的年龄大小
		System.out.println("person1 是否大于 person2 ?");
		System.out.println(person1.compareTo(person2) > 0);
		
	}
}

2 Comparator接口

基于比较器方式进行比较,Comparator定义如下:

//<T>中写比较的类
public interface Comparator<T> {
	//返回值
	// < 0,表示this指向的对象小于o指向的对象
	// > 0,表示this指向的对象大于o指向的对象
	// == 0,表示this指向的对象等于o指向的对象
	int compare(T o1,T o2);
}

我们知道Person类的比较不仅可以根据年龄还可以根据姓名来进行比较,但是当Comparable接口中的compareTo方法被重写后,我们就不能轻易修改,这时候该如何解决呢?
用户自定义比较器类,实现Comparator接口,并重写其中的compare方法。

//也就是说我们可以定义两个比较器类来实现接口Comparator接口
//AgeComparator.java实现年龄比较
public class AgeComparator implements Comparator<Person> {
	//根据年龄比较
	public int compare(Person o1,Person 02) {
		if(o1 == o1) {
			return 0;
		}
		if(o1 == null || 02 == null) {
			return -1;
		}
		return o1.age - o1.age;
	}
 
} 

//NameComparator.java实现年龄比较
public class NameComparator implements Comparator<Person> {
	//根据年龄比较
	public int compare(Person o1,Person 02) {
		if(o1 == o1) {
			return 0;
		}
		if(o1 == null || 02 == null) {
			return -1;
		}
		return o1.name.compare(o2);
	}
 
} 

//Main.java
public class Main {
	public static void main(String[] args) {
		Person person1 = new Person("lisi",18);
		Person person2 = new Person("wangwu",35);

		//根据自定义比较器类分别比较年龄和姓名
		System.out.println("根据姓名比较:");
		NameComparator nameComparator = new NameComparator();
		System.out.println("person1姓名 是否大于 person2姓名 ?");
		System.out.println(nameComparator.compare(person1,person2)> 0);
		
		System.out.println("根据年龄比较:");
		AgeComparator ageComparator = new AgeComparator();
		System.out.println("person1年龄 是否大于 person2年龄 ?");
		System.out.println(ageComparator.compare(person1,person2)> 0);	
	}
}

Comparable接口和Comparator接口都可以用于对象的比较,Comparable一般在当前类中使用,对当前类的侵入性比较强,Comparator对当前类的侵入性较弱,可以脱离当前类使用,当需要实现一个比较器对象。
#对象的比较 对象的比较一般可以使用父类继承下来的equals()方法(根据使用场景可重写)、实现Comparable接口并重写其中的compareTo() 方法,构造比较器类实现Comparator接口并重写compare()方法。

重写方法解释
Object.equals();所有类都继承于Object类
Comparable.compareTo();自定义类手动实现接口,对当前类侵入性较强
Comparator.compare();需要构造比较器类对象,对当前类侵入性较弱

到此这篇关于Java中Comparable接口和Comparator接口的实现的文章就介绍到这了,更多相关Java Comparable接口和Comparator接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现多任务执行助手

    Java实现多任务执行助手

    这篇文章主要为大家详细介绍了Java实现多任务执行助手,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Mybatis初始化知识小结

    Mybatis初始化知识小结

    Mybatis的初始化过程就是加载自己运行时所需要的配置信息的过程,这篇文章主要介绍了Mybatis初始化知识小结,需要的朋友可以参考下
    2021-10-10
  • Mybatis plus中使用in查询出错如何解决

    Mybatis plus中使用in查询出错如何解决

    这篇文章主要介绍了Mybatis plus中使用in查询出错的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 使用自定义注解进行restful请求参数的校验方式

    使用自定义注解进行restful请求参数的校验方式

    这篇文章主要介绍了使用自定义注解进行restful请求参数的校验方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java中常用的五种List声明并赋值操作方式

    Java中常用的五种List声明并赋值操作方式

    在Java编程中经常会使用到集合类来存储和操作多个元素,List是一种常见的集合类,它允许存储重复的元素,并且保持元素的插入顺序,这篇文章主要给大家介绍了关于Java中常用的五种List声明并赋值操作的相关资料,需要的朋友可以参考下
    2024-02-02
  • Spring Boot自定义注解从入门到实战指南

    Spring Boot自定义注解从入门到实战指南

    本文介绍了SpringBoot中自定义注解的设计、实现与应用技巧,涵盖了注解基础、创建自定义注解、注解处理器实现方案、高级注解特性、性能优化与最佳实践、实战案例、测试策略、常见问题与解决方案以及总结与最佳实践,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • 浅析Java基于Socket的文件传输案例

    浅析Java基于Socket的文件传输案例

    这篇文章主要针对Java基于Socket的文件传输案例进行详细解析,具有一定的参考价值,感兴趣的朋友可以参考一下
    2016-02-02
  • Java8新特性Stream流中anyMatch和allMatch和noneMatch的区别解析

    Java8新特性Stream流中anyMatch和allMatch和noneMatch的区别解析

    这篇文章主要介绍了Java8新特性Stream流中anyMatch和allMatch和noneMatch的区别解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • Spring笔记-@Order注解和Ordered接口解析

    Spring笔记-@Order注解和Ordered接口解析

    这篇文章主要介绍了Spring笔记-@Order注解和Ordered接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • SparkSQL中的JSON内置函数全解析

    SparkSQL中的JSON内置函数全解析

    你是否曾经为处理JSON数据而头疼?SparkSQL为我们提供了强大的内置JSON函数,让JSON处理变得轻而易举,本文将带你深入了解这些函数,感兴趣的朋友一起看看吧
    2024-08-08

最新评论