对象之间的比较

本文详细介绍了Java中比较对象的四种方式:==、equals、Comparable和Comparator。==用于判断对象的引用是否相同,equals重写后可以根据内容比较,Comparable用于实现对象的自然排序,Comparator则提供了外部排序的灵活性,允许自定义比较规则。示例代码展示了这些方法在扑克牌类Card中的应用。
摘要由CSDN通过智能技术生成

实现比较的方式一共有三种

  1. ==
  2. .equals
  3. Comparable
  4. Comparator
    其中等号比较的是对象的身份,也就是它们的地址是否相同,.equals比较的是对象自身,Comparable和Comparator都是可以比较对象的大小关系,具体根据什么进行比较我们可以自己定义

一、==

class Card {
    public String rank;//扑克牌的点数
    public String suit;//扑克牌的花色

    public Card(String rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }
}
public class equals {
    public static void main(String[] args) {
        Card p = new Card("10","♥");
        Card q = new Card("10","♥");
        Card o = p;
        System.out.println((p == q));//false
        System.out.println((p == o));//true
    }
}

这里的p和q指向的是两个不同的对象,地址也就不同,所以是false,p和o指向的是同一个对象,地址相同,也就是false

二、equals

class Card {
    public String rank;//扑克牌的点数
    public String suit;//扑克牌的花色

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

    @Override
    public boolean equals(Object obj) {
        if(obj==null){//如果拿来比较的对象为null的话直接返回false
            return false;
        }
        if(this==obj){//如果被比较的和拿来比较的是同一个对象返回true
            return true;
        }
        if(!(obj instanceof Card)) {//如果它们的类型不一样的话也返回false
            return false;
        }
        //接下来才是真正的比较两个对象的内容,其中的内容可以由我们自己定义根据什么比较‘
        Card other = (Card)obj;//首先需要对obj由Object类型强转为Card类型
        return (this.rank.equals(other.rank))&&(this.suit.equals(other.suit));//我们可以定义比较花色和点数
    }
}
public class equals {
    public static void main(String[] args) {
        Card p = new Card("10","♥");
        Card q = new Card("10","♥");
        Card o = p;
        System.out.println((p == q));//false
        System.out.println((p == o));//true

        System.out.println(("===================="));

        System.out.println((p.equals(q)));//true
        System.out.println((p.equals(o)));//true
    }
}

使用equals的时候需要将它进行重写,不然的话会执行Object版本的equals,相当于还是按照==号在进行。重写的时候我们可以根据自己的要求来定义根据什么进行比较。

三、Comparable
Comparable是一个接口,需要我们实现它并且重写里面的comparaTo方法

class Card implements Comparable<Card> {//这里利用泛型我们就可以不用手动进行类型转换
    public String rank;//扑克牌的点数
    public String suit;//扑克牌的花色

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

    @Override
    public boolean equals(Object obj) {
        if(obj==null){//如果拿来比较的对象为null的话直接返回false
            return false;
        }
        if(this==obj){//如果被比较的和拿来比较的是同一个对象返回true
            return true;
        }
        if(!(obj instanceof Card)) {//如果它们的类型不一样的话也返回false
            return false;
        }
        //接下来才是真正的比较两个对象的内容,其中的内容可以由我们自己定义根据什么比较‘
        Card other = (Card)obj;//首先需要对obj由Object类型强转为Card类型
        return (this.rank.equals(other.rank))&&(this.suit.equals(other.suit));//我们可以定义比较花色和点数
    }

    @Override
    public int compareTo(Card o) {
        if(o==null){//此时代表拿来比较的对象为null
            return 1;//默认为被比较对象大于拿来比较的对象,返回一个大于0的数字
        }
        int result1 = this.getvalue();
        int result2 = o.getvalue();
        return (result1-result2);
    }
    public int getvalue(){//通过这个方法我们可以把不能比较的转化为可以比较的自然数字
        int val = 0;
        if("j".equals(rank)){
            val = 11;
        }else if("Q".equals(rank)){
            val = 12;
        }else if("K".equals(rank)){
            val = 13;
        }else if("A".equals(rank)){
            val = 14;
        }else{
            val = Integer.parseInt(rank);//如果rak是2到10的话,直接转化成数字
        }
        return val;
    }

}
public class equals {
    public static void main(String[] args) {
        Card p = new Card("10","♥");
        Card q = new Card("10","♥");
        Card o = p;
        System.out.println((p == q));//false
        System.out.println((p == o));//true

        System.out.println(("===================="));

        System.out.println((p.equals(q)));//true
        System.out.println((p.equals(o)));//true
        System.out.println(("========================"));
        System.out.println((p.compareTo(q)));//0
        System.out.println((p.compareTo(o)));//0
    }
}

在ComparaTo方法中我们可以自己定义i根据什么来进行比较,不能比较的我们可以利用一个方法将它转换为自然数字来进行比较

四、Comparator
Comparator和Comparable类似,区别在于我们再写一个类来实现这个接口,不需要修改待比较类中的代码,降低耦合度。

class cardComparator implements Comparator<card>{//comparator这个接口需要重新写一个类来实现比较,
    @Override
    public int compare(card o1, card o2) {//这里的这两个参数就相当于是comparable里面的this和O
        //也就相当于是比较的那个元素和被比较的那个元素
        if(o1==o2){
            return 0;
        }
        if(o1==null){
            return -1;
        }
        if(o2==null){
            return 1;
        }
        int val1 = o1.getvalue();
        int val2 = o2.getvalue();
        return val1-val2;
    }

相比于Comparable,Comparator会更灵活一点,可以创建多个类来定义多种比较规则,而且不需要修改待比较类中的代码,毕竟实际开发中不是所有的类我们都能随意修改的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值