文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java对象对比之comparable和comparator的区别

2024-04-02 19:55

关注

一、元素的比较

1.1 基本类型的比较

java中的基本类型的对象是可以进行比较的


public static void main(String[] args){
        int a = 10;
        int b = 20;
        System.out.println(a>b);
        System.out.println(a==b);
        System.out.println(a<b);

        char c1 = 'A';
        char c2 = 'B';
        System.out.println(c1>c2);
        System.out.println(c1==c2);
        System.out.println(c1<c2);

        boolean b1 = true;
        boolean b2 =false;
        System.out.println(b1==b2);
        System.out.println(b1!=b2);
    }

在这里插入图片描述

1.2 对象的比较


public class Main{
    public static void main(String[] args){
       Card c1 = new Card(1,"♠");
        Card c2 = new Card(2,"♠");
        Card c3 = c1;
        System.out.println(c1==c2);
        System.out.println(c1==c3);
//        System.out.println(c1>c2);  编译报错
//        System.out.println(c1<c2);  编译报错
    }

}
class  Card{
    public int rank;
    public String suit;
     public Card(int rank,String suit){
         this.rank = rank;
         this.suit = suit;
     }
}

在这里插入图片描述

可以看出在进行相等比较时,是可以进行比较的,但进行大于或小于比较就不行了
这是因为对于用户实现自定义类型,都默认继承自Object类,而Object类中提供了equal方法,而==默认情况下调用的就是equal方法,但是该方法的比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地址,但有些情况下该种比较就不符合题意。

二、对象的比较

有些情况下,需要比较的是对象中的内容,比如:向优先级队列中插入某个对象时,需要对按照对象中内容来调整堆,那该如何处理呢?

2.1 覆写基类的equal

在这里插入图片描述

一般覆写 equals 的套路就是上面演示的

1.如果指向同一个对象,返回 true

2.如果传入的为 null,返回 false

3.如果传入的对象类型不是 Card,返回 false

4.按照类的实现目标完成比较,例如这里只要花色和数值一样,就认为是相同的牌

5.注意下调用其他引用类型的比较也需要 equals,例如这里的 suit 的比较
覆写基类equal的方式虽然可以比较,但缺陷是:equal只能按照相等进行比较,不能按照大于、小于的方式进行比较。

2.2 基于Comparable接口的比较

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


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

可以看到在Comparable接口中只实现了一个方法 compareTo,因此我们在实现自定义比较时,在类的定义中实现Comparable接口即可,然后在类中重写compareTo方法


public class Main{
    public static void main(String[] args){
        Card c1 = new Card(1,"♠");
        Card c2 = new Card(2,"♠");
        Card c3 = c1;
        System.out.println(c1.compareTo(c2));
        System.out.println(c1.compareTo(c3));
        System.out.println(c2.compareTo(c3));
        
    }

}
class  Card implements Comparable<Card>{
    public int rank;
    public String suit;
     public Card(int rank,String suit){
         this.rank = rank;
         this.suit = suit;
     }

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

在这里插入图片描述

当前值比要比较值小则输出-1;当前值与要比较值相等则输出0;
当前值比要比较值大输出1;

2.3 基于比较器Comparator的比较

首先了解一下Comparator接口


public interface Comparator<T> {
    
    int compare(T o1, T o2);

当然还有许多comparator实现的自定义比较方法,但这里我只贴出需要自己实现的方法compare;
接下来看看comparator的用法
当使用comparator时,如果要使用自定义的比较方式需要实现comparator接口,并且覆写compare方法;因此需要自己构造一个比较器类实现comparator接口,然后利用我们自定义的比较器进行比较即可;
下面是一个应用实例


// write your code here
import java.util.*;
import java.lang.*;

public class Main{
    public static void main(String[] args){
        Card c1 = new Card(1,"♠");
        Card c2 = new Card(2,"♠");
        Card c3 = c1;
        CardComparator cardComparator = new CardComparator();
        System.out.println(cardComparator.compare(c1,c2));
        System.out.println(cardComparator.compare(c1,c3));
        System.out.println(cardComparator.compare(c2,c3));
    }
}
class  Card {
    public int rank;
    public String suit;
     public Card(int rank,String suit){
         this.rank = rank;
         this.suit = suit;
     }
}
class  CardComparator implements Comparator<Card>{

    @Override
    public int compare(Card o1, Card o2) {
        if (o1==o2){
            return 0;
        }
        if (o1==null)return -1;
        if (o2==null)return 1;
        return o1.rank-o2.rank;
    }
}

在这里插入图片描述

Comparator属于java.util包中泛型接口类,使用时必须导入相关的包;
我们将Comparator中的compare方法重写,就可以对需要进行对比的对象进行对比并返回结果。

2.4 几种不同的compare对比

方法 说明
object.equals 直接覆写即可,不过只能比较相等与否
Comparable.compareTO 需要手动实现接口,当前类之后的所有对比方式都被定义,属于内部顺序
Comparator.compare 需要实现一个比较器对象,对待比较类的侵入性弱,但对代码的侵入性强

到此这篇关于java对象对比之comparable和comparator的区别的文章就介绍到这了,更多相关comparable和comparator的区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯