Java 对象的比较

1.关于对象值相等的比较:
p == q 表示的是两个引用指向同一个对象
p.equals(q) 默认情况下也是比较身份。
示例:

class Card1 {
    public String suit;
    public int rank;

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


}

public class Test2{
    public static void main(String[] args) {
        Card1 c1 = new Card1("♠",10);
        Card1 c2 = new Card1("♠",10);
        Card1 c3 = c1;
        System.out.println(c1 == c3); // true 如果不重写 equals 方法,默认的 equals 是比较身份
        System.out.println(c1.equals(c2)); // false 如果不重写 equals 方法,默认的 equals 是比较身份
    }
}

重写 equals 方法后:

class Card1 {
    public String suit;
    public int rank;

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

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (obj == null || !(obj instanceof Card1)) {
            return false;
        }
        Card1 otherCard = (Card1) obj;
        return this.rank == otherCard.rank
                && this.suit.equals(otherCard.suit);
    }
}

public class Test2{
    public static void main(String[] args) {
        Card1 c1 = new Card1("♠",10);
        Card1 c2 = new Card1("♠",10);
        Card1 c3 = c1;
        System.out.println(c1.equals(c2)); // true 重写完 equals 方法后按照重写的规则比较。
    }
}

注意重写 equals 方法的套路:
(1)如果指向同一个对象就返回 true;
(2)如果传入的对象为 null, 就返回 false;
(3)如果传入的对象不是要比较的类型,就返回 false;
(4)按照需要设定要比较的内容。例如上面相等的条件是 花色(suit)和点数(rank)都要相等才算相等。
(5)注意下调用其他引用类型的比较呀需要 equals,例如这里的 suit 的比较。

2.关于对象 小于、等于、大于的比较。
有两种方法:
(1)在让比较的类继承 Comparable 接口,重写 compareTo 方法。
(2)定义一个对象继承 Comparator 接口,重写 compare 方法。
方法一:

class Card1 implements Comparable<Card1> {
    public String suit;
    public int rank;

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

    @Override
    public int compareTo(Card1 o) {
        //比较 this 和 o 这两个对象的大小关系
        //如果 this < o, 返回 < 0 的整数
        //如果 this > o, 返回 > 0 的整数
        //如果相等,返回 0.
        if(this == o) {
        	return 0;
        }
        if (o == null) {
            return 1;
        }
//        if (this.rank < o.rank) {
//            return -1;
//        } else if (this.rank > o.rank) {
//            return 1;
//        } else {
//            return 0;
//        }
        return this.rank - o.rank;
    }
}

public class Test2{
    public static void main(String[] args) {
        Card1 c1 = new Card1("♠",10);
        Card1 c2 = new Card1("♠",9);
        System.out.println(c1.compareTo(c2)); // true 
    }
}

方法二:

class Card1 {
    public String suit;
    public int rank;

    public Card1(String suit, int rank) {
        this.suit = suit;
        this.rank = rank;
    }
}
class CardComparator1 implements Comparator<Card1> {
    @Override
    public int compare(Card1 o1, Card1 o2) {
        //如果 o1 < o2 ,返回 < 0 的整数
        //如果 o1 > o2 ,返回 > 0 的整数
        //如果 o1 和 o2 相等,返回 0.
        //直接调用 compareTo 的情况
        //return o1.compareTo(o2);
        if (o1 == o2) {
            return 0;
        }
        if (o1 == null) {
            //o2 一定不是 null
            return -1;
        }
        if (o2 == null) {
            return 1;
        }
        return o1.rank - o2.rank;
    }
}

public class Test2{
    public static void main(String[] args) {
        Card1 c1 = new Card1("♠",10);
        Card1 c2 = new Card1("♦",10);
        CardComparator1 cardComparator1 = new CardComparator1();
        System.out.println(cardComparator1.compare(c1, c2));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值