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接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot中YAML配置文件实例详解

    SpringBoot中YAML配置文件实例详解

    前面一直在使用properties配置文件,spring boot也支持yaml配置文件,下面这篇文章主要给大家介绍了关于SpringBoot中YAML配置文件的相关资料,需要的朋友可以参考下
    2023-04-04
  • java实现简单控制台通讯录

    java实现简单控制台通讯录

    这篇文章主要为大家详细介绍了java实现简单控制台通讯录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Google Kaptcha验证码生成的使用实例说明

    Google Kaptcha验证码生成的使用实例说明

    这篇文章主要为大家介绍了Google Kaptcha验证码的使用实例说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • java多线程编程之向线程传递数据的三种方法

    java多线程编程之向线程传递数据的三种方法

    在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别。由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据
    2014-01-01
  • java JIT调优的实现

    java JIT调优的实现

    JIT编译器调优方法包括启用JIT日志、优化热点代码、循环展开、内联优化、逃逸分析以及使用性能分析工具等,本文主要介绍了java JIT调优的实现,感兴趣的可以了解一下
    2025-02-02
  • Java线程池队列LinkedTransferQueue示例详解

    Java线程池队列LinkedTransferQueue示例详解

    这篇文章主要为大家介绍了Java线程池队列LinkedTransferQueue示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • SpringBoot随机数设置及参数间引用的操作步骤

    SpringBoot随机数设置及参数间引用的操作步骤

    在Spring Boot配置文件中设置属性时,除了可以像前面示例中显示的配置属性值外,还可以使用随机值和参数间引用对属性值进行设置。下面给大家介绍SpringBoot参数间引用随机数设置的操作步骤,感兴趣的朋友一起看看吧
    2021-06-06
  • JAVA反射机制中getClass和class对比分析

    JAVA反射机制中getClass和class对比分析

    这篇文章主要介绍了JAVA反射机制中getClass和class对比分析,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • java数据结构基础:稀疏数组

    java数据结构基础:稀疏数组

    今天带大家了解一下Java稀疏数组的相关知识,文中有非常详细的介绍及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-08-08
  • Spring Boot整合mybatis(一)实例代码

    Spring Boot整合mybatis(一)实例代码

    sprig-boot是一个微服务架构,加快了spring工程快速开发,以及简便了配置。接下来开始spring-boot与mybatis的整合
    2017-07-07

最新评论