Java中Comparable与Comparator的区别
Posted xujiangxi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中Comparable与Comparator的区别相关的知识,希望对你有一定的参考价值。
相同
- Comparable和Comparator都是用来实现对象的比较、排序
- 要想对象比较、排序,都需要实现Comparable或Comparator接口
- Comparable和Comparator都是Java的接口
区别
- Comparator位于java.util包下,而Comparable位于java.lang包下
- Comparable接口的实现是在类的内部(如 String、Integer已经实现了Comparable接口,自己就可以完成比较大小操作),Comparator接口的实现是在类的外部(可以理解为一个是自已完成比较,一个是外部程序实现比较)
- 实现Comparable接口要重写compareTo方法, 在compareTo方法里面实现比较
- 可以调用Arrays.sort或者Collections.sort()实现排序。
- array.sort(array),int/Integer array[] = {4,5,0,1,3,6} 看这个array数组是什么类型的 如果要排序的数组类型是Integer类型则底层sort调用的是MergeSort,因为Integer是一个引用数据类型,存在对象内部二次排序的问题,是一个对象,所以稳定排序。
- 如果是int,则底层调用quickSort排序,因为Int类型是一个基本数据类型,不存在对象内部二次排序的问题,所以要调用非稳定排序。
实现Comparable接口要重写compareTo方法, 在compareTo方法里面实现比较
1 public class Person implements Comparable<Person>{ 2 String name; 3 int age; 4 int weight; 5 public Person(String name, int age,int weight) 6 { 7 super(); 8 this.name = name; 9 this.age = age; 10 this.weight = weight; 11 } 12 public String getName() 13 { 14 return name; 15 } 16 public int getAge() 17 { 18 return age; 19 } 20 public int getWeight() 21 { 22 return weight; 23 } 24 @Override 25 public int compareTo(Person p) 26 { 27 if(this.age - p.age == 0){ 28 return this.weight - p.weight; 29 } 30 else 31 {return this.age - p.age;} 32 }
public class UserInfo { public static void main(String[] args) { Person[] people=new Person[]{ new Person("xujian", 20,60), new Person("xiewei", 10,70), new Person("xiewei", 20,70)}; System.out.println("排序前"); for (Person person : people) { System.out.println(person.getName()+":"+person.getAge()+‘:‘+person.weight); } Arrays.sort(people); System.out.println(" 排序后"); for (Person person : people) { System.out.println(person.getName()+":"+person.getAge()+‘:‘+person.weight); } int[] array = {123,2,3,4}; Integer[] array1 = {123,2,3,4}; }
实现Comparator需要重写 compare 方法
public class PersonComparator { public static void main(String[] args) { List<Person> personList = new ArrayList<Person>(); personList.add(new Person("xujian", 20,60)); personList.add(new Person("xiewei", 10,70)); personList.add(new Person("xiewei", 20,70)); System.out.println("排序前"); for (Person person : personList) { System.out.println(person.getName()+":"+person.getAge()+‘:‘+person.weight); } Collections.sort(personList, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { if(o1.age - o2.age == 0){ return o1.weight - o2.weight; } else {return o1.age - o2.age;} } }); System.out.println("排序前"); for (Person person : personList) { System.out.println(person.getName()+":"+person.getAge()+‘:‘+person.weight); } } }
以上的例子中用到的是,稳定排序,先排序年龄,在年龄相同的情况下然后按照体重排序。
总结:
- 如果比较的方法只要用在一个类中,用该类实现Comparable接口就可以。
- 如果比较的方法在很多类中需要用到,就自己写个类实现Comparator接口,这样当要比较的时候把实现了Comparator接口的类传过去就可以,省得重复造轮子。这也是为什么Comparator会在java.util包下的原因。
使用Comparator的优点是:1.与实体类分离 2.方便应对多变的排序规则
以上是关于Java中Comparable与Comparator的区别的主要内容,如果未能解决你的问题,请参考以下文章