Comparable:
从字面理解,Comparable是可比较的意思。
从源码来看:Comparable接口只有一个方法:
public int compareTo(T o);
具体需要实现的功能:
结合源码和字面意思来看:所有实现了Comparable接口的类都是一个可以进行比较的类,而且可以和任意类型的对象进行比较,但是比较的方法就具体由自己来定义实现。
所有的包装类好像都实现了这个接口。
具体例子:
学生类实现Comparable接口,比较规则是根据id进行比较
package ykh.comparable;
import java.util.Comparator;
public class Student implements Comparable<Student>{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student() {
}
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public int compareTo(Student o) {
if(this.id>o.getId()) return 1;
else if(this.id==o.getId())return 0;
else return -1;
}
}
排序实例(利用冒泡排序)
package ykh.comparable;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class CompareTest {
public static void main(String[] args) {
Student s1=new Student(001,"caixukunchang");
Student s2=new Student(002,"caixukuntiao");
Student s3=new Student(003,"caixukunball");
Student s4=new Student(004,"caixukunrap");
Student[] s= {s1,s2,s3,s4};
int len=s.length;
for(int j=0;j<len-1;j++) {
for(int i=0;i<len-1-j;i++) {
if(s[i].compareTo(s[i+1])==1) {
Student temp=s[i];
s[i]=s[i+1];
s[i+1]=temp;
}
}
}
for(int k=0;k<len;k++) {
System.out.println(s[k].getName()+":"+s[k].getId());
}
}
}
当一个类没有实现这个接口时,或者这个类中的比较方法不是最佳方法时。我们会怎么办?
一般情况下会选择修改源码,但是这不是一个好选择。我们就想可不可以做一个比较器来实现自己想要的比较方法呢?于是Comparator接口就出现了。
Comparator接口:
从字面意思来理解:它是比较器的意思(大概)。
从源代码来看:
实现此接口的类只需要实现 int compare(T o1, T o2);方法即可。equals方法不需要实现(该方法已经被Object方法实现了)
具体看实例:
创建比较器:
class StudentComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
if(o1.getId()>o2.getId())return 1;
else if(o1.getId()==o2.getId())return 0;
else return -1;
}
}
利用此比较器进行比较排序:
package ykh.comparable;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class CompareTest {
public static void main(String[] args) {
Student s1=new Student(001,"caixukunchang");
Student s2=new Student(002,"caixukuntiao");
Student s3=new Student(003,"caixukunball");
Student s4=new Student(004,"caixukunrap");
Student[] s= {s1,s2,s3,s4};
int len=s.length;
StudentComparator c=new StudentComparator();
for(int j=0;j<len-1;j++) {
for(int i=0;i<len-1-j;i++) {
if(c.compare(s[i], s[i+1])==1) {
Student temp=s[i];
s[i]=s[i+1];
s[i+1]=temp;
}
}
}
for(int k=0;k<len;k++) {
System.out.println(s[k].getName()+":"+s[k].getId());
}
}
}
总结:
1.Comparable是表示该类可以比较,是该类的具体对象以一种方式和其他对象进行比较。也就是本身要参与进来。
2.Comparator是一种工具。他规定那两个对象以一种规定的方式进行比较。本身是不参与比较的。参与比较的是传入的object对象。