千家信息网

如何理解java对象的比较

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要讲解了"如何理解java对象的比较",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何理解java对象的比较"吧!目录1、元素的比较2、类的
千家信息网最后更新 2025年01月20日如何理解java对象的比较

这篇文章主要讲解了"如何理解java对象的比较",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何理解java对象的比较"吧!

目录
  • 1、元素的比较

  • 2、类的比较

  • 3、比较方法

    • 3.1 重写equals方法

    • 3.2 基于Comparble接口类的比较

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

    • 3.4 三种比较方式的对比

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(ach3);        System.out.println(ch2==ch3);        System.out.println(ch2

对于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

从此编译结果中我们可以发现,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{// 返回值:// < 0: 表示 this 指向的对象小于 o 指向的对象// == 0: 表示 this 指向的对象等于 o 指向的对象// > 0: 表示 this 指向的对象等于 o 指向的对象public int compareTo(T o);}

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

class Card implements Comparable{    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接口

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

  • 户自定义比较器类,实现Comparator接口

  • 覆写Comparator中的compare方法

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{    @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对象的比较这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0