0 概述

在实际项目开发过程中,不仅需要简单类型之间进行比较,有时还需要比较自定义类型。 面试问题:Java当中是如何比较自定义类型的大小呢?

例如:

class Student {    public String name;    public int age;    public Student(String name, int age) {        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }}public class TestDemo {    public static void main(String[] args) {        Student student1 = new Student("bit",12);        Student student2 = new Student("gaobo",13);        //代码编译出错        System.out.println(student1 > student2);    }}


在Java中,自定义类型之间不可以通过大于、小于等进行比较。一般有3种对象的比较方式:Comparable ,Comparator 和 equals()。 今天,带大家先了解前两个方式。 1 Comparable接口

准备一个自定义类,并且实现接口 Comparable :

class Student implements Comparable<Student>{    public String name;    public int age;    public Student(String name, int age) {        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }    @Override    public int compareTo(Student o) {        if(this.age > o.age) {            return 1;        }        if(this.age == o.age) {            return 0;        }        return -1;    }}public class TestDemo {    public static void main(String[] args) {        Student student1 = new Student("bit",12);        Student student2 = new Student("gaobo",13);        if(student1.compareTo(student2) > 0 ) {            System.out.println("student1的年龄 > student2的年龄");        }else if(student1.compareTo(student2) == 0){            System.out.println("student1的年龄 == student2的年龄");        }else {            System.out.println("student1的年龄 < student2的年龄");        }    }}


运行程序输出:student1的年龄 < student2的年龄 总结:我们可以看到,这样就能根据年龄进行比较啦,当然也有同学会问,怎么拿姓名比较呢?哎,这也就显现出这个接口的弊端了,如果按照姓名进行比较,我们需要重新实现compareTo方法。 具体如下:

@Overridepublic int compareTo(Student o) {  return this.name.compareTo(o.name);}


它的弊端就是,一旦在类中写死,就只能修改类内部,太不适用了! 2 Comparator

我们接下来看这个接口,它也被叫做比较器(看这个名字就高大上的不行哈~),我们来看看它是怎么实现的。

class Person {    public String name;    public int age;    public int score;    public Person(String name, int age, int score) {        this.name = name;        this.age = age;        this.score = score;    }    @Override    public String toString() {        return "Person{" +                "name='" + name + '\'' +                ", age=" + age +                ", score=" + score +                '}';    }}class AgeComparator implements Comparator<Person> {    @Override    public int compare(Person o1, Person o2) {        //如果从小到大排序 o1.age  < o2.age;  交换        return o1.age-o2.age;    }}class ScoreComparator implements Comparator<Person>{    @Override    public int compare(Person o1, Person o2) {        return o1.score-o2.score;    }}public class TestComparator {  public static void main2(String[] args) {        Person person1 = new Person("gao",14,89);        Person person2 = new Person("bit",54,19);        Person person3 = new Person("hello",24,79);        //根据分数进行比较        ScoreComparator scoreComparator = new ScoreComparator();        System.out.println(scoreComparator.compare(person1,person2));        System.out.println(scoreComparator.compare(person2,person3));        System.out.println(scoreComparator.compare(person1,person3));     }    public static void main1(String[] args) {        Person person1 = new Person("gao",14,89);        Person person2 = new Person("bit",54,19);        Person person3 = new Person("hello",24,79);        //根据年龄进行比较        AgeComparator ageComparator = new AgeComparator();        System.out.println(ageComparator.compare(person1,person2));        System.out.println(ageComparator.compare(person2,person3));        System.out.println(ageComparator.compare(person1,person3));    }}


童鞋们,看到上面的方法是不是觉得很方便,想拿什么比较,自己写个比较器就好,非常便捷。 另外,大博哥再介绍另外一个高级用法:

public static void main(String[] args) {    Person[] people = new Person[3];    people[0] = new Person("gao",14,89);    people[1] = new Person("bit",54,19);    people[2] = new Person("hello",24,79);    ScoreComparator scoreComparator = new ScoreComparator();    Arrays.sort(people,scoreComparator);    System.out.println(Arrays.toString(people));}


我们可以给Arrays.sort()的第二个参数,传入排序的比较器,来规定它的比较方式。 3 总结

综上所述:Java自定义类型的比较,一定要实现这两个接口,具体的要看业务需求。

java比例 字段 java比较字符大小_comparator 字符串比较大小


作者:高博