【Java数据结构】 ---对象的比较

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言Java

欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~

前言

在这里插入图片描述

上图中,线性表、堆、树等等,基本都有增删查改的操作。根据之前的学习,分为大根堆小根堆,而插入数据就需要比较数据否则要插入的数据要插入到哪里去呢?

元素的比较

Java初阶学习过,基本类型的对象可以直接比较大小。

int a=10;
int b=20;

System.out.println(a > b);
System.out.println(a < b);
System.out.println(a == b);

在这里插入图片描述

运行代码,可直接得出答案。

那么引用类型的对象可以直接比较吗?

class Student {
    public int ID; // 数值
    public String name; // 花色
    public Student(int ID, String name) {
        this.ID = ID;
        this.name = name;
    }
}
public class Test {
    public static void main(String[] args) {
        Student c1 = new Student(1, "zhang");
        Student c2 = new Student(2, "wang");
        Student c3 = c1;
        //System.out.println(c1 > c2);  // 编译报错
        System.out.println(c1 == c2);  
        //System.out.println(c1 < c2);  // 编译报错
        System.out.println(c1 == c3); 
    }
}

在这里插入图片描述
从运行结果看出来,Java中引用类型的变量不能直接进行比较。

对于我们实现自定义类型(Student),都默认继承自Object类,而Object类中提供了equal方法,而==默认情况下调用的就是equal方法,但是该方法的比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地址.

但是大多数情况下,我们都是去比较引用变量里面的内容。

// Object中equal的实现,可以看到:直接比较的是两个引用变量的地址
public boolean equals(Object obj) {
  return (this == obj);
}

对象的比较

重写equals

@Override
public boolean equals(Object obj) {
  if(this==obj){
     return true;
  } 
}

一般重写equals就是上面演示的。
注意:

  1. 如果传入同一个对象,返回true;
  2. 按照类的实现目标完成比较;
  3. 注意下调用其他引用类型的比较也需要 equals
  4. equal只能按照相等进行比较,不能按照大于、小于的方式进行比较。

基于Comparble接口类的比较

Comparble是JDK提供的泛型的比较接口类,源码实现具体如下:

public interface Comparable<E> {
  int compareTo(E o);
}

在这里插入图片描述

对于用户自定义类型,如果要想按照大小与方式进行比较时:在定义类时,实现Comparble接口即可,然后在类
重写compareTo方法。

@Override
  public int compareTo(Student o) {
    if (o == null) {
      return 1;
   }
    return ID- o.ID;
 }

 public class Test {
    public static void main(String[] args) {
        Student c1 = new Student(1, "zhang");
        Student c2 = new Student(2, "wang");
        Student c3 = c1;

        System.out.println(c1.compareTo(c1)); 
        System.out.println(c1.compareTo(c2));   
        System.out.println(c2.compareTo(c1));   
    }
}

在这里插入图片描述

基于比较器的比较

用户自定义比较器类,源码实现Comparator接口:

public interface Comparator<T> {
  // 返回值:
  // < 0: 表示 o1 指向的对象小于 o2 指向的对象
  // == 0: 表示 o1 指向的对象等于 o2 指向的对象
  // > 0: 表示 o1 指向的对象等于 o2 指向的对象
  int compare(T o1, T o2);
}

在这里插入图片描述
重写Comparator中的compare方法:

class StudentComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        if (o1 == o2) {
            return 0;
        }
        if (o1 == null) {
            return -1;
        }
        if (o2 == null) {
            return 1;
        }
        return o1.ID - o2.ID;
    }
public class Test {
    public static void main(String[] args) {
        Student c1 = new Student(1, "zhang");
        Student c2 = new Student(2, "wang");
        Student c3 = c1;
        
        // 定义比较器对象
        StudentComparator cmptor= new StudentComparator();
        
        // 使用比较器对象进行比较
        System.out.println(cmptor.compare(c1, c1)); 
        System.out.println(cmptor.compare(c1, c2));   
        System.out.println(cmptor.compare(c2, c1));   
    }

在这里插入图片描述

三种比较方式的对比

方法说明
Object.equals因为所有类都继承自Object接口,所以直接覆写即可, 只能比较是否相等·
Comparable.compareTo需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于内部顺序
Comparator.compare需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性强

总的来说:对于我这样的小白来说,三种方法并没有优劣之分,只要能用,会用就是一个好方法

完结

好了,到这里Java语法部分就已经结束了~
如果这个系列博客对你有帮助的话,可以点一个免费的赞并收藏起来哟~
可以点点关注,避免找不到我~ ,我的主页:optimistic_chen
我们下期不见不散~~Java

下期预告: 【Java数据结构】- - -Java比较

评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值