文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

浅谈java对象的比较

2024-04-02 19:55

关注

1、元素的比较

java中,基本类型的对象可以直接比较大小。


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

        //字符的比较根据字符所对应ASCII值来比较大小
        char ch1='a';
        char ch2='b';
        char ch3='c';
        System.out.println(ch1>ch2);
        System.out.println(ch1==ch2);
        System.out.println(ch1<ch2);

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

对于String类的比较可以参考我之前写的博客:初识javaString

2、类的比较

对于类的比较如果直接像元素比较一样可能会造成编译错误或者与预期效果的不一样。


class Card{
    public int rank;
    public String suit;
    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }
}
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==c2);//打印false,因为c1和c2指向的是不同对象
//        System.out.println(c1<c2);编译报错
        System.out.println(c1==c3);//打印false,因为c1和c2指向的是不同对象
    }
}

从此编译结果中我们可以发现,java中引用类型的变量不能直接按照> 或者< 方式进行比较,但确可以使用==符号进行比较?
原因:对于用户自己实现定义的类型,都是默认为Object类,Object类提供了equal方法,

此方法的比较规则是:

无比较引用变量引用对象的内容,而是直接比较引用变量的地址,因此equal方法一般在使用的时候会被重写


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

3、比较方法

在一些情况下,我们需要比较的是对象的内容,而不是比较对象的地址是否相同,则需要重写比较方法。

3.1 重写equals方法


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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        // o如果是null对象,或者o不是Card的子类
        if (o == null || !(o instanceof Card)) return false;
        Card card = (Card) o;
        return rank == card.rank && Objects.equals(suit, card.suit);
    }
}
Public class Main{
public static void main(String[] args){
  Card c1 = new Card(1, "♠");
        Card c2 = new Card(1, "♠");
        System.out.println(c1.equals(c2));
}
}

equal方法实现如下:

如果这个类指向同一个对象则直接返回true;
如果传入的为空或者其对象类型不是Card,则返回false
按照类的实现目标完成比较,这里只要花色和数值一样,就认为是相同的牌
注意下调用其他引用类型的比较也需要 equals,例如这里的 suit 的比较

3.2 基于Comparble接口类的比较

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


public interface Comparable<E>{
// 返回值:
// < 0: 表示 this 指向的对象小于 o 指向的对象
// == 0: 表示 this 指向的对象等于 o 指向的对象
// > 0: 表示 this 指向的对象等于 o 指向的对象
public int compareTo(T o);
}

对于用户自定义类型,如果按照大小与方式进行比较:可以在定义类的时候实现接口Comparable,并在类中重写compareTo方法。


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) {
        return this.rank-o.rank;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || !(o instanceof Card)) return false;
        Card card = (Card) o;
        return rank == card.rank && Objects.equals(suit, card.suit);
    }
}
public class Main {
    public static void main(String[] args) {
        Card p = new Card(1, "♠");
        Card q = new Card(2, "♠");
        Card o = new Card(1, "♠");
        System.out.println(p.compareTo(o)); // == 0,表示牌相等
        System.out.println(p.compareTo(q));// < 0,表示 p 比较小
        System.out.println(q.compareTo(p));// > 0,表示 q 比较大
    }
    }

3.3 基于比较器比较基于比较器比较:Comparator接口

按照比较器方式进行比较,具体步骤如下:


class Card{
    public int rank;
    public String suit;
    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || !(o instanceof Card)) return false;
        Card card = (Card) o;
        return rank == card.rank && Objects.equals(suit, card.suit);
    }
}
class CardComparator implements Comparator<Card>{
    @Override
    // 返回值:
    // < 0: 表示 o1 指向的对象小于 o2 指向的对象
    // == 0: 表示 o1 指向的对象等于 o2 指向的对象
    // > 0: 表示 o1 指向的对象等于 o2 指向的对象
    public int compare(Card o1, Card o2) {
       if (o1 == o2) {
            return 0;
        }
        //判断o1是否为空
        if (o1 == null) {
            return -1;
        }
        //判断o2是否为空
        if (o2 == null) {
            return 1;
        }
        return o1.rank - o2.rank;
    }
}
public class Main {
     public static void main(String[] args) {
        Card p = new Card(1, "♠");
        Card q = new Card(2, "♠");
        Card o = new Card(1, "♠");
        //定义比较器对象
        CardComparator cmptor = new CardComparator();
        // 使用比较器对象进行比较
        // == 0,表示牌相等
        System.out.println(cmptor.compare(p, o)); 
        // < 0,表示 p 比较小
        System.out.println(cmptor.compare(p, q)); 
        // > 0,表示 q 比较大
        System.out.println(cmptor.compare(q, p)); 
    }
}

3.4 三种比较方式的对比


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

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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