Comparable、Comparator比较器

本文详细对比了Java中Comparable和Comparator接口的区别与应用场景。Comparable接口使类自身具备比较能力,但其比较逻辑与源代码耦合;Comparator接口作为独立的比较工具,通过策略模式分离比较逻辑,便于更改比较规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Comparable和Comparator都是用作元素比较的接口,Comparable位于java.lang包下,Comparator位于java.util包下,从名字以及路径可以大概看出来,Comparable倾向于使得实现该接口的类本身成为可比较的(常见的例如Cloneable,Serializable,当然Serializable处于java.io包下,因为人家更偏于表现出可传输特性),都是表明拥有了某种能力;Comparator则是一种用于比较的工具。

Comparable

只有一个方法

int compareTo(T o)

返回负数,零,正数分别表示隐式对象小于、等于、大于比较对象o。

示例:

public class t{
	public static void main(String[] args) {
		Person p1=new Person("ac",3);
		Person p2=new Person("ab",2);
		
		List<Person> arr=new ArrayList<Person>();
		arr.add(p1);
		arr.add(p2);
		Collections.sort(arr);
		System.out.println(arr.get(0)+"\n"+arr.get(1));
		
	}
}
class Person implements Comparable<Person>{//先按照名字排序,名字相同按照年龄
	private String name;
	private int age;
	public Person(String name,int age){
		this.name=name;
		this.age=age;
	}
	public String toString(){
		return "name:"+name+" age:"+age;
	}
	public int compareTo(Person ano){
		int i=name.compareTo(ano.name);
		if(i==0){
			return age-ano.age;
		}else{
			return i;
		}
	}
}

Comparator

需要实现方法

int compare(T o1,To2)

compare方法可以表示相等的情况,闲着无聊也可以在实现类内部重写equals方法,不写的话类本身继承Object中的equals表示隐式对象与比较对象是同一个对象

public boolean equals(Object obj) {
        return (this == obj);
    }
Comparator作为一种比较器,对某种类型的数据提供比较支持

示例:

public class t{
	public static void main(String[] args) {
		Person p1=new Person("ac",3);
		Person p2=new Person("ab",2);
		
		List<Person> arr=new ArrayList<Person>();
		arr.add(p1);
		arr.add(p2);
		Collections.sort(arr,new PersonComparator());
		System.out.println(arr.get(0)+"\n"+arr.get(1));
		
	}
}

class PersonComparator implements Comparator<Person>{
	public int compare(Person one,Person ano){
		int i=0;
		i=one.getName().compareTo(ano.getName());
		if(i==0){
			return one.getAge()-ano.getAge();
		}else{
			return i;
		}
	}
}

class Person {
	private String name;
	private int age;
	public Person(String name,int age){
		this.name=name;
		this.age=age;
	}
	public String getName(){
		return this.name;
	}
	public int getAge(){
		return this.age;
	}
	public String toString(){
		return "name:"+name+" age:"+age;
	}
	
}
从比较函数可以看出,Comparable的compareTo方法对传入的对象进行比较,对象内部是可以实现比较的;Comparator的compare方法对传入的两个对象进行比较,比较策略定义在Comparator类内部,属于一种策略模式,当需要更换比较策略时,直接换个Comparator即可。

总结

Comparable实现自身的比较功能,但是比较策略与源代码耦合在一起,修改比较规则时需要更改源代码,Comparator提供比较工具,将对象的比较规则定义在另一个类中,实现了可替换。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值