关于java中的comparable接口

Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。可以使用Arrays.sort()对改类进行排序

1.Comparable接口

使用场景:假如说我们有这样一个需求,需要设计一个Person类,有两个属性:姓名(name)、年龄(age),按照年龄的大小进行排序,那么实现可以这样

代码:

class Person implements Comparable<Person>{
    int age;
    String name;

    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "姓名:"+name+","+"年龄:"+age+";";
    }

    @Override
    public int compareTo(Person o) {
        // TODO Auto-generated method stub
        if(this.age>o.age){
            return 1;
        }else if(this.age<o.age){
            return -1;
        }
        //当然也可以这样实现
        // return Integer.compare(this.age, o.age);
        return 0;
    }
}

测试:

public static void main(String[] args) {

    Person []persons = new Person[]{
        new Person("张三",15),
        new Person("李四",25),
        new Person("王五",20)
    };
    Arrays.sort(persons);
    System.out.println(Arrays.toString(persons));
    System.out.println(persons[0]==persons[1]);
    System.out.println(persons[0].equals(persons[1]));

}

结果:

[姓名:王五,年龄:10;, 姓名:张三,年龄:15;, 姓名:李四,年龄:15;, 姓名:赵刘,年龄:45;]
false
false
1
2
3

注意细节

Comparable接口里面有一个泛型T,T的选择为可以与之比较的对象的类型,一般就是实现该接口类的本身,可以这样想和Person类比较的当然是Person本身了。
Comparable只是在Arrays里面起作用,其他地方目前我并没有发现什么作用,包括运算符和equals上,这个接口也不起什么作用。
2.Comparator接口
Comparator也是一个比较器,但是属于挽救设计的一种,一般来说尽量减少。

使用场景:假如说我们有这样一个需求,需要对Person类的年龄进行排序,Person类有两个属性:姓名(name)、年龄(age),但是Person类是别人写好的,里面没有Comparable接口,如果在不允许改变源代码的情况下,我们可以使用Comparator接口。

代码:

class Person {
    int age;
    String name;

    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
   
    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "姓名:"+name+","+"年龄:"+age+";";
    }
}
class PersonComparator implements Comparator<Person> {

    @Override
    public int compare(Person o1, Person o2) {
        // TODO Auto-generated method stub
        return Integer.compare(o1.age, o2.age);
    }

}

测试:

public static void main(String[] args) {

    Person []persons = new Person[]{
        new Person("张三",15),
        new Person("李四",15),
        new Person("王五",10),
        new Person("赵刘",45)
    };
    Arrays.sort(persons,new PersonComparator());
    System.out.println(Arrays.toString(persons));

}

结果:

[姓名:王五,年龄:10;, 姓名:张三,年龄:15;, 姓名:李四,年龄:15;, 姓名:赵刘,年龄:45;]

注意细节

Comparator,其中泛型T为比较器可以比较的对象的类型,在这里面为Person
总结
Comparable和Comparator的区别:

java.lang.Comparable:在类定义的时候,可以实现好的接口,里面有compareTo这个方法需要实现。
java.util.Comparator:是挽救的比较接口,需要单独定义一个比较类,里面有compare比较方法。
在更多情况下我们使用比较多的还是Comparable接口,在实际开发过程中的话,其实两者使用都比较少。

————————————————

转载原文链接:https://blog.csdn.net/qq_41474648/article/details/105182845

  • 10
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值