Comparable和Comparator

Comparable和Comparator区别
1、Comparable是内部比较器,仅针对某个类进行比较,和具体类绑定,而Comparator是外部比较器,适用于多种类,只需要建立这些类的比较器即可。
2、另外,Comparator实际上是一种策略模式,比如TreeMap / TreeSet中持有Comparator接口的引用Comparator comparator,通过TreeMap(排序类)的构造参数传入不同的Comparator实现类,就制定了TreeMap中key的不同比较规则。两个排序同时存在时采用 Comparator(定制排序)的规则进行比较。
例子:

public interface Comparable<T> {
	public int compareTo(T o);
}

一个类要想能够比较,需要实现Comparable接口,重写compareTo方法

public interface Comparator<T> {
	int compare(T o1, T o2);
	boolean equals(Object obj);
    // 其他已经实现的方法
}

// 采用Comparable实现比较,必须向原有类中增加重写的compareTo方法,会改变类的内容。
public class Person implements Comparable<Person> {
	private String name;
	private int age;
    public Person(String name, int age) {
    	this.name = name;
    	this.age = age;
    }
    @Override
    public int compareTo(Person p) {
    	return this.age - p.age;
    }
    @Override
    public String toString() {
    	return name + ":" + age;
    }
}

public class Test {
	public static void main(String[] args) {
		Person p1 = new Person("zz", 2);
		Person p2 = new Person("z", 1);
		Person p3 = new Person("zzz", 3);
        List<Person> persons = new ArrayList<>();
        persons.add(p1);
        persons.add(p2);
        persons.add(p3);
        Collections.sort(persons);
        System.out.println(persons);
	}
}
// 输出
[z:1, zz:2, zzz:3]

// 如果要求不能改变类的内容,那么只能使用Comparator比较器。比如我们修饰Person类为final的
// 使用Comparator只需要重写compare方法,为什么没重写Comparator中的equals方法?因为任何类都继承自Object类,实现Comparator接口的类也不例外,而Object类中已经实现了equals方法,所以我们可以不用重写equals方法
public final class Person {
	private String name;
	private int age;
    public Person(String name, int age) {
    	this.name = name;
    	this.age = age;
    }
    @Override
    public String toString() {
    	return name + ":" + age;
    }
}

public class Test {
	public static void main(String[] args) {
		Person p1 = new Person("zz", 2);
		Person p2 = new Perosn("z", 1);
		Person p3 = new Person("zzz", 3);
		List<Person> persons = new ArrayList<>();
		persons.add(p1);
		persons.add(p2);
		persons.add(p3);
        Collections.sort(persons, new Comparator<Person>() {
        	@Override
            public int compare(Person p1, Perosn p2) {
            	return p1.age - p2.age;
            }
        });
        System.out.println(persons);
	}
}
// 输出
[z:1, zz:2, zzz:3]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值