东莞网站竞价推广/开封seo公司
Java Comparator和Comparable的区别
使用区别:
Comparable & Comparator 都是用来实现集合中元素的比较、排序的;
Comparable 是在集合内部
定义的方法实现的排序,
Comparator 是在集合外部
实现的排序,
所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。
Comparable定义:
package java.lang;
import java.util.*;public interface Comparable<T> {public int compareTo(T o);
}
Comparator定义:
package java.util;public interface Comparator<T> {int compare(T o1, T o2);boolean equals(Object obj);}
若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现equals(Object obj) 函数。
上述的compareTo和compare函数是自定义排序的方法,当这两个函数返回正数,则交换两个数的位置,解释如下:
-
x.compareTo(y): 如果return x-y; 则表示升序排列,因为数组中x在前,y在后,x-y如果是负数,则保持原序,即升序;如果x-y是正数,则交换两个数位置,使之保持升序。
-
compare(T o1, T o2): 如果return o1-o2; 则表示升序排列,原因如上
Comparable例子:
package thread.comparable;import java.util.ArrayList;
import java.util.Collections;public class Person implements Comparable {private int age;private String name;public Person(String name,int age) {this.age = age;this.name = name;}@Overridepublic int compareTo(Object o) {if (o instanceof Person) {Person person = (Person) o;int result;result = getAge() - person.getAge();//result =person.getAge() - getAge();return result;}return 0;}@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public static void main(String[] args) {ArrayList<Person> list = new ArrayList<Person>();list.add(new Person("ccc", 20));list.add(new Person("AAA", 30));list.add(new Person("bbb", 10));list.add(new Person("ddd", 40));// 打印list的原始序列System.out.printf("Original sort, list:%s\n", list);Collections.sort(list);System.out.printf("Original sort, list:%s\n", list);}
}
Comparator例子:
import java.util.ArrayList;
import java.util.Comparator;public class Person {private int age;private String name;public Person(String name, int age) {this.age = age;this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}}class AseAgePerson implements Comparator<Person> {@Overridepublic int compare(Person o1, Person o2) {int result;result = o1.getAge() - o2.getAge();return result;}}class DescAgePerson implements Comparator<Person> {@Overridepublic int compare(Person o1, Person o2) {int result;result = o2.getAge() - o1.getAge();return result;}}class Test {public static void main(String[] args) {ArrayList<Person> list = new ArrayList<>();list.add(new Person("ccc", 20));list.add(new Person("AAA", 30));list.add(new Person("bbb", 10));list.add(new Person("ddd", 40));// 打印list的原始序列System.out.println(list);list.sort(new AseAgePerson());//list.sort(new DescAgePerson());System.out.println(list);}
}
参考:https://www.jianshu.com/p/6f564e298918