首页 > 代码库 > Java的Comparator和Comparable对比

Java的Comparator和Comparable对比

1.对象如何对比排序?

Java的基本类型如int, float, double都可以直接使用java.util.Arrays.sort(Object[])对比排序,那对象是如何比较排序的呢?我们定义的类都是继承Object类的,Object类的equals的方法,默认是比较两个对象是否相等(hashcode相同)

public boolean equals(Object obj) {  
    return (this == obj);  
}  
而我们现实要求一般不是这样比较,可以通过实现Comparable或Comparator接口来重新定义对象的排序。

2.Comparable

java.lang.Comparable: int compareTo(Object o1)

这个方法用于当前对象与o1对象做对比,返回int值,分别的意思是:

  • positive – 当前对象大于o1
  • zero – 当前对象等于o1
  • negative – 当前对象小于o1
例子:
import java.util.*;

class ComparableDemo{
	public static void main(String[] args) {
		Student[] stu={new Student(18,"Mark"),new Student(22,"John"),new Student(20,"Tom"),new Student(19,"Jim")};
		Arrays.sort(stu);
		for(Student s:stu){
			System.out.println("the age:"+s.age+",the name:"+s.name);
		}
	}
}

class Student implements Comparable{
	public int age;
	public String name;

	Student(int age,String name){
		this.age=age;
		this.name=name;
	}

	public int compareTo(Object s){       
		return this.age-((Student)s).age;
	}
}

3.Comparator

java.util.Comparator: int compare(Object o1, Objecto2)

这个方法用于o1与o2对象做对比,返回int值,分别的意思是:

  • positive – o1大于o2
  • zero – o1等于o2
  • negative – o1小于o2
例子:

import java.util.*;

class ComparatorDemo{
	public static void main(String[] args) {
		Student[] stu={new Student(18,"Mark"),new Student(22,"John"),new Student(20,"Tom"),new Student(19,"Jim")};
		/*
		//也可以直接将比较器以内部类形式定义
		Comparator<Student> comp=new Comparator<Student>{
			public int compare(Student s1,Student s2){
				return s1.age-s2.age;
			}
		};
		Arrays.sort(stu,comp);
		*/

		Arrays.sort(stu,new StuComparator());
		for(Student s:stu){
			System.out.println("the age:"+s.age+",the name:"+s.name);
		}
	}
}

class Student{
	public int age;
	public String name;

	Student(int age,String name){
		this.age=age;
		this.name=name;
	}
}

class StuComparator implements Comparator<Student>{
	public int compare(Student s1,Student s2){
		return s1.age-s2.age;
	}
}


4.两种方式区别:

一个类实现了Comparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、定义类时若没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等(比较灵活)

即:

Comparable对应使用的是:java.util.Collections.sort(List) 或 java.util.Arrays.sort(Object[])

Comparator对应使用的是:java.util.Collections.sort(List, Comparator) 或 java.util.Arrays.sort(Object[], Comparator)

---EOF---

Java的Comparator和Comparable对比