Java对象的比较 (equals()方法、基于Compareable接口、基于比较器的比较、基于Compareable接口和基于比较器的区别)--- Java内功心法

目录

1.equals()方法的覆写

2.基于Compareable接口的比较:

3.基于比较器的比较:

4.基于Compareable接口和基于比较器的比较的区别:


       

在Java中对象不能直接用'>'、'<'号进行比较,而'='号只能比较对象引用指向的空间是否是同一个,那么这时候就要将对象比较的方法进行覆写。

1.equals()方法的覆写

class Student {
    private String name;
    private int age;

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

    @Override
    public boolean equals(Object o) {
        //如果是自己和自己比较
        if (this == o) {
            return true;
        }

        //如果o是空类型,且o不是Student类
        if (o == null || o instanceof Student) {
            return false;
        }

        //比较name和age的大小
        Student s = (Student) o;
        return this.name.equals(s.name) && this.age == s.age;
    }
}

由于所有类的父类都是Object类,那么只要覆写Object类里的equals()方法就可以了。

2.基于Compareable接口的比较:

        想要比较变量的大小,可以实现Compareable接口,覆写其中的compareTo方法。

class Student implements Comparable<Student>{
    private String name;
    private int age;

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

    //在这里我们认为o为null是最小的
    //先比较name的大小,如果相同,再比较age的大小。
    @Override
    public int compareTo(Student o) {
        if (o == null) {
            return 1;
        }

        if (this.name.compareTo(o.name) != 0) {
            return this.name.compareTo(o.name);
        } else {
            return this.age - o.age;
        }
    }
}

3.基于比较器的比较:

        用户自定义比较器类,然后实现Comparator接口,覆写Comparator接口里的compare()方法:

class Student{
    public String name;
    public int age;

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

class StuComparator implements Comparator<Student> {
    //我们同样认为null是最小的
    //先比较name的大小,如果相同,再比较age的大小。
    @Override
    public int compare(Student o1, Student o2) {
        if (o1 == null && o2 == null) {
            return 0;
        }

        if (o1 == null && o2 != null) {
            return -1;
        }

        if(o1 != null && o2 == null) {
            return 1;
        }

        if (!o1.name.equals(o2.name)) {
            return o1.name.compareTo(o2.name);
        } else {
            return o1.age - o2.age;
        }
    }
}

4.基于Compareable接口和基于比较器的比较的区别:

由于private修饰的变量只能在类中访问,那么我们基于比较器所比较的对象的变量不能是private修饰的:

 因此可以得出结论:

1.基于Comparable接口需要在类内部覆写方法,侵入性比较强,一旦实现,每次使用类似PriorityQueue这种可以实现Comparable接口的集合时,每次使用该类都是基于覆写方法里实现的顺序,属于内部顺序。

2.基于比较器接口对比较类的侵入性弱,但对算法代码的侵入性强。

 

来篇正能量:

“上帝,请让我再救一个吧!”_哔哩哔哩_bilibili

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值