前言
java中基本数据类型可以直接比较大小,但引用类型呢?同时引用对象中可能存在多个可比较的字段,那么我们该怎么比较呢?
java中引用类型不能直接进行大小的比较,这种行为在编译器看来是危险的,所以会编译失败;
想要实现引用类型的比较,那么我们可以实现comparable接口和comparator接口
1 comparable接口
comparable接口是jdk提供的泛型比较接口类,源码实现大概如下:
//<t>中写比较的类
public interface comparable<t> {
//返回值
// < 0,表示this指向的对象小于o指向的对象
// > 0,表示this指向的对象大于o指向的对象
// == 0,表示this指向的对象等于o指向的对象
int compareto(t o);
}
通常对于用户自定义类型,如果想要按照大小进行比较,那么我们需要在定义类的时候实现comparable接口,并重写compareto方法。
//存在一个person类,根据年龄比较大小
public class person implements comparable<person> {
public string name;
public int age;
public person(string name,int age) {
this.name = name;
this.age = age;
}
//重写compareto方法
int compareto(person o) {
if(o == null) {
return 1;
}
return this.age - o.age;
}
}
//main.java
public class main {
public static void main(string[] args) {
person person1 = new person("lisi",18);
person person2 = new person("wangwu",35);
//比较person1和person2的年龄大小
system.out.println("person1 是否大于 person2 ?");
system.out.println(person1.compareto(person2) > 0);
}
}
2 comparator接口
基于比较器方式进行比较,comparator定义如下:
//<t>中写比较的类
public interface comparator<t> {
//返回值
// < 0,表示this指向的对象小于o指向的对象
// > 0,表示this指向的对象大于o指向的对象
// == 0,表示this指向的对象等于o指向的对象
int compare(t o1,t o2);
}
我们知道person类的比较不仅可以根据年龄还可以根据姓名来进行比较,但是当comparable接口中的compareto方法被重写后,我们就不能轻易修改,这时候该如何解决呢?
用户自定义比较器类,实现comparator接口,并重写其中的compare方法。
//也就是说我们可以定义两个比较器类来实现接口comparator接口
//agecomparator.java实现年龄比较
public class agecomparator implements comparator<person> {
//根据年龄比较
public int compare(person o1,person 02) {
if(o1 == o1) {
return 0;
}
if(o1 == null || 02 == null) {
return -1;
}
return o1.age - o1.age;
}
}
//namecomparator.java实现年龄比较
public class namecomparator implements comparator<person> {
//根据年龄比较
public int compare(person o1,person 02) {
if(o1 == o1) {
return 0;
}
if(o1 == null || 02 == null) {
return -1;
}
return o1.name.compare(o2);
}
}
//main.java
public class main {
public static void main(string[] args) {
person person1 = new person("lisi",18);
person person2 = new person("wangwu",35);
//根据自定义比较器类分别比较年龄和姓名
system.out.println("根据姓名比较:");
namecomparator namecomparator = new namecomparator();
system.out.println("person1姓名 是否大于 person2姓名 ?");
system.out.println(namecomparator.compare(person1,person2)> 0);
system.out.println("根据年龄比较:");
agecomparator agecomparator = new agecomparator();
system.out.println("person1年龄 是否大于 person2年龄 ?");
system.out.println(agecomparator.compare(person1,person2)> 0);
}
}
comparable接口和comparator接口都可以用于对象的比较,comparable一般在当前类中使用,对当前类的侵入性比较强,comparator对当前类的侵入性较弱,可以脱离当前类使用,当需要实现一个比较器对象。
#对象的比较 对象的比较一般可以使用父类继承下来的equals()方法(根据使用场景可重写)、实现comparable接口并重写其中的compareto() 方法,构造比较器类实现comparator接口并重写compare()方法。
| 重写方法 | 解释 |
|---|---|
| object.equals(); | 所有类都继承于object类 |
| comparable.compareto(); | 自定义类手动实现接口,对当前类侵入性较强 |
| comparator.compare(); | 需要构造比较器类对象,对当前类侵入性较弱 |
到此这篇关于java中comparable接口和comparator接口的实现的文章就介绍到这了,更多相关java comparable接口和comparator接口内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论