JavaSE--Comparator 和 Comparable 区别
public interface Comparable<T>
此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
实现此接口的对象列表(和数组)可以通过 Collections.sort
(和 Arrays.sort
)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
public interface Comparator<T>
强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort
或 Arrays.sort
),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set
或有序映射
)的顺序,或者为那些没有自然顺序
的对象 collection 提供排序。
区别:简单的说就是 Comparable 的实现使得类可以排序,而 Comparator 的应用场景是需要排序的类本身并没有实现 Comparator 接口,这时候调用 Arrays 的 sort方法则需要传入一个比较器,一般传入一个匿名局部内部类。
1 package org.wzh.compare2; 2 3 public interface Animal { 4 5 int getAge(); 6 7 }
1 package org.wzh.compare2; 2 3 public class Cat implements Animal { 4 5 private String name; 6 private int age; 7 8 public Cat() { 9 } 10 11 public Cat(String name, int age) { 12 super(); 13 this.name = name; 14 this.age = age; 15 } 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getAge() { 26 return age; 27 } 28 29 public void setAge(int age) { 30 this.age = age; 31 } 32 33 @Override 34 public String toString() { 35 return "Cat [name=" + name + ", age=" + age + "]"; 36 } 37 38 }
1 package org.wzh.compare2; 2 3 public class Dog implements Animal { 4 5 private String name; 6 private int age; 7 8 public Dog() { 9 } 10 11 public Dog(String name, int age) { 12 super(); 13 this.name = name; 14 this.age = age; 15 } 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getAge() { 26 return age; 27 } 28 29 public void setAge(int age) { 30 this.age = age; 31 } 32 33 @Override 34 public String toString() { 35 return "Dog [name=" + name + ", age=" + age + "]"; 36 } 37 38 39 }
package org.wzh.compare2; import java.util.Arrays; import java.util.Comparator; public class TestCompare { public static void main(String[] args) { Dog dog = new Dog("Shrek", 17); Cat cat = new Cat("Tom", 12); Animal[] animals = new Animal[]{dog, cat}; System.out.println(Arrays.toString(animals)); Arrays.sort(animals, new Comparator<Animal>() { public int compare(Animal o1, Animal o2) { // TODO Auto-generated method stub return o1.getAge() - o2.getAge(); } }); System.out.println(Arrays.toString(animals)); } }
如果 Dog 和 Cat 类都实现了 Comparable 接口,直接使用
static void |
sort(Object[] a) 根据元素的自然顺序对指定对象数组按升序进行排序。 |
反之,秉着不修改已完成代码的情况下排序则使用
static
|
sort(T[] a, Comparator<? super T> c) 根据指定比较器产生的顺序对指定对象数组进行排序。 |