Java - Comparable接口和Comparator接口的区别

使用目的

Comparable和Comparator接口都是实现集合中元素的比较、排序的。

对于Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要手动定义比较规则,也就是需要依靠Comparable或者Comparator。

可以把Comparable理解为内部比较器,而Comparator是外部比较器。


Comparable

Comparable接口有且仅有一个方法:public int compareTo(T o); 

Comparable 是一个对象本身就已经支持自比较所需要实现的接口。

如String、Integer自己就实现了Comparable接口,可完成比较大小操作。

如果自定义类要在加入list容器中后能够排序,可以实现Comparable接口,重写compareTo(T o)方法

在用Collections类的sort方法排序时若不指定Comparator,那就需要实现Comparable接口,重写compareTo(T o)方法。
实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

compareTo(T o)方法

该方法将此对象与指定对象进行排序比较。如果此对象小于、等于或大于指定对象,则返回负整数、零或正整数。 

public class Person implements Comparable<Person> {
	String name;
	int age;
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public Person() {
		super();
	}
	
	@Override
	public int compareTo(Person o) {
		
		return this.age - o.age;
	}
}

import java.util.Arrays;

public class Test {

	public static void main(String[] args) {
		Person p1 = new Person("zhangsan", 20);
		Person p2 = new Person("lisi", 18);
		Person p3 = new Person("wangwu", 25);
		
		Person[] persons = {p1, p2, p3};
		System.out.println("排序前");
		for (Person person : persons) {
			System.out.println(person.name + ":" + person.age);
		}
		//Arrays是数组工具类,Collections是集合工具类
		Arrays.sort(persons);
		System.out.println("排序后");
		for (Person person : persons) {
			System.out.println(person.name + ":" + person.age);
		}
	}

}

String类重写了实现了Comparable接口重写了compareTo方法:

public int compareTo(String anotherString) {
    int len1 = value.length;
    int len2 = anotherString.value.length;
    int lim = Math.min(len1, len2);
    char v1[] = value;
    char v2[] = anotherString.value;

    int k = 0;
    while (k < lim) {
        char c1 = v1[k];
        char c2 = v2[k];
        if (c1 != c2) {
            return c1 - c2;
        }
        k++;
    }
    return len1 - len2;
}


Comparator

Comparator被称为外部比较器

如果我们需要对某个类A进行排序,但是这个类又不实现Comparable接口并重写方法。

这样的话这个类A自己就没有比较规则了。

这时我们可以另外定义一个实现了Comparator接口的类B,来作为这个没有比较规则的类A的“比较器”。这个“比较器”只需要实现Comparator接口即可。

实现了Comparator接口的类B(比较器),要实现compare(T o1, T o2)方法,该方法中就是我们自定义的对类A进行比较的规则 
int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

public class Person {
	String name;
	int age;
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public Person() {
		super();
	}
}
import java.util.Comparator;

public class PersonComparator implements Comparator<Person>{

	@Override
	public int compare(Person o1, Person o2) {
		return o1.age - o2.age;
	}
	
}
import java.util.Arrays;

public class Test {

	public static void main(String[] args) {
		Person p1 = new Person("zhangsan", 20);
		Person p2 = new Person("lisi", 18);
		Person p3 = new Person("wangwu", 25);
		
		Person[] persons = {p1, p2, p3};
		System.out.println("排序前");
		for (Person person : persons) {
			System.out.println(person.name + ":" + person.age);
		}
		
		Arrays.sort(persons, new PersonComparator());
		System.out.println("排序后");
		for (Person person : persons) {
			System.out.println(person.name + ":" + person.age);
		}
	}
}


总结

Comparable和Comparator都可以用来帮助类进行比较、排序。

Comparable可以直接在需要进行排序的类中实现,重写compateTo(T o)方法

而Comparator需要另外定一个实现Comparator接口的实现类来作为“比较器”

用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。

用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值