Comparable和Comparator区别(超详细对比分析)

  • Post author:
  • Post category:其他


Comparable和Comparator接口都是实现集合中元素的比较、排序的,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较逻辑。可以把Comparable理解为内部比较器,而Comparator是外部比较器。



一、Comparable

java.lang包中

Comparable 是一个对象本身就已经支持自比较所需要实现的接口,如String、Integer自己就实现了Comparable接口,可完成比较大小操作。自定义类要在加入list容器中后能够排序,也可以实现Comparable接口,在用Collections类的sort方法排序时若不指定Comparator,那就以自然顺序排序。所谓自然顺序就是实现Comparable接口设定的排序方式。因此我们需要在实现了Comparable接口的类中重写compareTo(T o)方法。

实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

例子:

先写一个实现了Comparable接口的person类

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;
	}
}

编写测试类,来对person对象进行排序

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);
		}
	}

}

运行结果:

在这里插入图片描述



二、Comparator

java.util包中

Comparator被称为外部比较器,是因为如果我们需要对某个类(为了便于理解,我们这里称这个类为类A)进行排序(该类本身不支持排序),我们可以另外定义一个实现了Comparator接口的类(类B),来作为类A的“比较器”。这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。



注意:

1、 类B即实现了Comparator接口的类,一定要实现compare(T o1, T o2)方法,该方法中就是我们自定义的对类A进行比较的规则 ;

2、 int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

例子:

创建一个Person类

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

下面我们来创建person类的比较器PersonComparator类:

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 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

参考:

https://www.cnblogs.com/miracle77hp/p/10341288.html

.



版权声明:本文为qq_45559536原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。