Java的Comparator和Comparable对比

来源:互联网 发布:mac 越狱工具 编辑:程序博客网 时间:2024/04/29 12:15

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

0 0