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自定义类型的比较,一定要实现这两个接口,具体的要看业务需求。
作者:高博