Comarable和Comparator都是用来实现集合中元素的比较、排序的,Comparable是在集合内部定义的方法实现排序,Comparator是在集合外部实现的排序,Comparable位于java.lang包,Comparator位于java.util包。
Comparable:
当前类小于参数返回负数,等于返回0,大于返回正数。
class Person implements Comparable<Person>{ String name; int age; Person(String n, int a) { name = n; age = a; } @Override public int compareTo(Person person) { return name.compareTo(person.name); } } ArrayList<Person> list = new ArrayList<Person>(); list.add(new Person("aaa", 10)); list.add(new Person("bbb", 20)); list.add(new Person("ccc", 30)); Collections.sort(list); //这里会自动调用Person中重写的compareTo方法。
Comparator:
可以通过两种方式实现自定义排序
1.定义一个类实现Comparator接口,重写compare方法。
2.语法不同,在内部new这个接口并重写compare方法。
第一个参数小于第二个参数返回负数,相等返回0,大于返回正数。
class Person { String name; int age; Person(String n, int a) { name = n; age = a; } } class DemoComparator implements Comparator<Person> { @Override public int compare(Person a, Person b) { return a.name.compareToIgnoreCase(b.name); } } class Demo { public static void main(String[] args) { List<Person> persons = Arrays.asList( new Person("Joe", 24), new Person("Pete", 18), new Person("Chris", 21) ); Collections.sort(persons, new DemoComparator()); System.out.println(persons); //[{name=Chris, age=21}, {name=Joe, age=24}, {name=Pete, age=18}] Collections.sort(persons, new Comparator<Person>() { @Override public int compare(Person a, Person b) { return a.age < b.age ? -1 : a.age == b.age ? 0 : 1; } }); System.out.println(persons); //[{name=Pete, age=18}, {name=Chris, age=21}, {name=Joe, age=24}] } }