前言
最近复习遇到了这个问题,在此进行一个详细的记录,分享给大家。
两个接口的区别
包区别
Comparable接口是在java.lang下。
Comparator接口是在java.util下。
使用区别
如果在定义类时,就实现了Comparable接口,直接在里面重写compareTo()方法,如果没实现,后面在业务开发中需要有比较排序的功能,就再单独写一个类实现Comparator接口,在里面重写compare()方法,然后这个类需要作为参数传入到工具类Collections.sort和Arrays.sort方法中。
使用场景
主要用于集合排序Collections.sort和Arrays.sort。
使用Comparable接口的实现方案
在定义类的时候,就实现这个接口,将排序规则定义好。
-
/**
-
* 实体类,实现Comparable接口
-
*/
-
public class Person implements Comparable<Person>{
-
-
//属性
-
private String name;
-
private int age;
-
private int salary;
-
-
//get和set方法
-
public String getName() {
-
return name;
-
}
-
-
public void setName(String name) {
-
this.name = name;
-
}
-
-
public int getAge() {
-
return age;
-
}
-
-
public void setAge(int age) {
-
this.age = age;
-
}
-
-
public int getSalary() {
-
return salary;
-
}
-
-
public void setSalary(int salary) {
-
this.salary = salary;
-
}
-
-
//构造方法
-
public Person(String name, int age, int salary) {
-
this.name = name;
-
this.age = age;
-
this.salary = salary;
-
}
-
-
@Override
-
public String toString() {
-
return "Person{" +
-
"name='" + name + '\'' +
-
", age=" + age +
-
", salary=" + salary +
-
'}';
-
}
-
-
//重写接口方法,o为要比较的对象
-
@Override
-
public int compareTo(Person o) {
-
//大于要比较的对象就返回1
-
if(this.salary>o.getSalary()){
-
return 1;
-
}
-
//小于则返回-1
-
else if(this.salary<o.getSalary()){
-
return -1;
-
}
-
//相等则返回0
-
return 0;
-
}
-
}
测试方法:
-
import java.util.ArrayList;
-
import java.util.Collections;
-
import java.util.List;
-
-
public class TestComparable {
-
-
public static void main(String[] args) {
-
//测试Comparable接口
-
Person p1=new Person("clyang",18,4000);
-
Person p2=new Person("messi",30,8000);
-
Person p3=new Person("ronald",32,9000);
-
Person p4=new Person("herry",19,7600);
-
Person p5=new Person("roben",35,7900);
-
-
//添加到集合
-
List<Person> list=new ArrayList<>();
-
list.add(p1);
-
list.add(p2);
-
list.add(p3);
-
list.add(p4);
-
list.add(p5);
-
-
System.out.println("-----------------排序前-----------------");
-
for (Person person : list) {
-
System.out.println(person);
-
}
-
-
//排序一般使用Collections.sort方法,或者使用Arrays.sort方法,按照比较的元素进行自然排序,即从小到大
-
Collections.sort(list);
-
-
System.out.println("-----------------排序后-----------------");
-
for (Person person : list) {
-
System.out.println(person);
-
}
-
-
}
-
}
使用Comparator
这个接口主要用于实体创建的时候,没有实现接口,但又需要比较的情况。
-
/**
-
* 实体类,不实现Comparable接口,使用单独的Comparator接口
-
*/
-
public class Staff {
-
-
//属性
-
private String name;
-
private int age;
-
private int salary;
-
-
public Staff(String name, int age, int salary) {
-
this.name = name;
-
this.age = age;
-
this.salary = salary;
-
}
-
-
public String getName() {
-
return name;
-
}
-
-
public void setName(String name) {
-
this.name = name;
-
}
-
-
public int getAge() {
-
return age;
-
}
-
-
public void setAge(int age) {
-
this.age = age;
-
}
-
-
public int getSalary() {
-
return salary;
-
}
-
-
public void setSalary(int salary) {
-
this.salary = salary;
-
}
-
-
@Override
-
public String toString() {
-
return "Staff{" +
-
"name='" + name + '\'' +
-
", age=" + age +
-
", salary=" + salary +
-
'}';
-
}
-
}
创建接口的实现类
-
import java.util.Comparator;
-
-
/**
-
* 单独写的比较器,实现Compartor接口
-
*/
-
public class StaffComparator implements Comparator<Staff> {
-
-
//不一定要自然排序即升序,可以反过来写成降序
-
@Override
-
public int compare(Staff o1, Staff o2) {
-
//降序
-
/*if(o1.getSalary()>o2.getSalary()){
-
return -1;
-
}
-
if(o1.getSalary()<o2.getSalary()){
-
return 1;
-
}
-
return 0;*/
-
-
//升序
-
/*if(o1.getSalary()>o2.getSalary()){
-
return 1;
-
}
-
if(o1.getSalary()<o2.getSalary()){
-
return -1;
-
}
-
return 0;*/
-
-
//先按照年龄倒序排,如果年龄相等比较工资
-
if(o1.getAge()>o2.getAge()){
-
return -1;
-
}
-
if(o1.getAge()<o2.getAge()){
-
return 1;
-
}
-
//能到这里说明年龄相等,继续比较工资
-
if(o1.getSalary()>o2.getSalary()){
-
return 1;
-
}
-
if(o1.getSalary()<o2.getSalary()){
-
return -1;
-
}
-
return 0;
-
}
-
}
测试方法:
-
import java.util.ArrayList;
-
import java.util.Collections;
-
import java.util.Comparator;
-
import java.util.List;
-
-
public class TestComparator {
-
-
public static void main(String[] args) {
-
//测试Comparator接口
-
Staff p1=new Staff("clyang",18,4000);
-
Staff p2=new Staff("messi",30,8000);
-
Staff p3=new Staff("ronald",32,9000);
-
Staff p4=new Staff("herry",18,7600);
-
Staff p5=new Staff("roben",35,7900);
-
-
//添加到集合
-
List<Staff> list=new ArrayList<>();
-
list.add(p1);
-
list.add(p2);
-
list.add(p3);
-
list.add(p4);
-
list.add(p5);
-
-
System.out.println("-----------------排序前-----------------");
-
for (Staff staff : list) {
-
System.out.println(staff);
-
}
-
-
//排序,需要使用自定义比较类
-
Comparator myComparator=new StaffComparator();
-
Collections.sort(list,myComparator);
-
-
System.out.println("-----------------排序后-----------------");
-
for (Staff staff : list) {
-
System.out.println(staff);
-
}
-
}
-
}
总结
两种接口的最主要区别还是一个对象自己实现和后期实现的区别。
评论(0)