先看一个案例:
class Student{
public int age;
public String name;
public double score;
public Student(int age, String name, double score) {
this.age = age;
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", score=" + score +
'}';
}
}
public class TestDemo {
public static void main(String[] args) {
Student[] students = new Student[3];
students[0] = new Student(18,"芃娃",85.5);
students[1] = new Student(21,"懿娃",78.4);
students[2] = new Student(22,"虎子",65.2);
Arrays.sort(students);
System.out.println(Arrays.toString(students));
}
}
运行上述代码,控制台信息如下所示:
报错的原因是我们并没有指明比较规则,按年龄?分数?姓名?
一、Comparable
让上述代码让Student实现Comparable接口,重写compareTo方法。利用age进行比较~~
@Override
public int compareTo(Student o) {
if(this.age > o.age){
return 1;
}else {
return -1;
}
}
此时重写了compareTo方法之后再运行,结果如下:
如果自定义的数据类型,进行大小的比较,一定要实现可以比较的接口(Comparable)
这个接口有一个很大的缺点:对类的侵入性非常强。一旦写好了,不敢轻易改动~~
二、Comparator
class AgeComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2){
return o1.age - o2.age;
}
}
class ScoreComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
return (int)(o1.score - o2.score);
}
}
public static void main(String[] args) {
Student[] students = new Student[3];
students[0] = new Student(18,"芃娃",85.5);
students[1] = new Student(17,"懿娃",78.4);
students[2] = new Student(22,"虎子",65.2);
AgeComparator ageComparator = new AgeComparator();
ScoreComparator scoreComparator = new ScoreComparator();
System.out.println("按年龄排序:");
Arrays.sort(students,ageComparator);
System.out.println(Arrays.toString(students));
System.out.println("按分数排序:");
Arrays.sort(students,scoreComparator);
System.out.println(Arrays.toString(students));
}
比较器:根据你的需求灵活的进行排序,对类的侵入性非常弱~~可以随时对排序规则进行修改
推荐的做法~~比较器
三、Cloneable
class Person implements Cloneable{
public int age;
public void eat(){
System.out.println("吃!");
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class TestDemo2 {
public static void main(String[] args) throws CloneNotSupportedException {
Person person = new Person();
person.age = 15;
Person person1 = (Person) person.clone();
System.out.println(person1.age);
}
}
实现Cloneable接口,重写object的clone方法~