首先说明一下这两个都是用来排序的, 只是应用起来有点差别而已.
有以下情景:
对于 List<String> list = new ArrayList<String>(); 我们可以直接用 Collections.sort(list); 排序. 那么我们如果有自己一个类比如: Person类, 要想在List中排序的话, 怎么做?
1. 使用 Comparable 接口在 Person 类内部实现排序
2. 使用 Comparator 接口自定义一个排序类, 在使用 Collections.sort() 方法的时候传进去, 实现排序.
首先来说第一种方法:
定义一个Person 类, 实现 Comparable 接口, 并实现其 compareTo(T o) 方法
public class Person implements Comparable<Person> { private String name; private Integer age; public Person() { super(); } public Person(String name, Integer age) { super(); this.name = name; this.age = age; } @Override public int compareTo(Person o) { if (this.age > o.age) { return 1; } else if (this.age < o.age) { return -1; } return 0; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
关于返回值需要知道:
a). 返回 正数 表示当前对象比传入的对象大.
b). 返回 负数 表示当前对象比传入的对象小.
c). 返回 0 表示等值.
测试类:
import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.junit.Test; public class TestComparable { @Test public void test() { List<Person> list = new ArrayList<>(); Person p1 = new Person("Tom", 12); Person p2 = new Person("Mike", 14); Person p3 = new Person("Jerry", 6); list.add(p1); list.add(p2); list.add(p3); // 对 list 集合进行排序, 这时Person类中的 compareTo起排序作用. Collections.sort(list); System.out.println(list); } }
这种方法灵活度差, 只适用于当前类, 通用性差, 但是简单, 只要实现这个接口, 定义了比较的规则, 直接调用 Collections.sort(list); 就可以了.
接下来说第二种方法:
首先要自己写一个排序类, 并实现 Comparator 接口.
import java.util.Comparator; public class MyComparator implements Comparator<String> { @Override public int compare(String o1, String o2) { if( o1.charAt(1) > o2.charAt(1) ){ return 1; } else if(o1.charAt(1) < o2.charAt(1)){ return -1; } return 0; } }
当然我这里是给 String 类排序, 只是例子, 因为String 类已经内部利用第一种方法实现了排序, 可以查看 String 的源代码.
返回值的规则与第一种方法是一样的.
测试类:
import java.util.Arrays; import java.util.List; import org.junit.Test; public class TestComparator { @Test public void test(){ List<String> list = Arrays.asList("Tom","Mike","Jerry","Kim"); list.sort(new MyComparator()); System.out.println(list); } }
用这个方法的好处是, 不需要修改源代码, 只需要定义比较器就可以了, 然后在排序的时候把比较器传进去就 OK 了.
也可以写一些通用的比较方法在里面, 提高通用性.
各有好处, 灵活使用就好了.