对象的比较

值相等的比较

  1. ==操作:p==q表示p和q两个引用指向同一个对象。
  2. equals方法:p.equals(q)表示p只想的对象和q指向的对象是否是值相等的。
    对于自定义的对象,如果想要比较两个对象是否相等,需要重写equals方法。
示例
//自定义一个类Card,数据成员有牌面值和花色
public class Card {
	public int rank; // 数值
	public String suit; // 花色
	public Card(int rank, String suit) {
		this.rank = rank;
		this.suit = suit;
	}
	//重写equals方法,比较牌面值和花色是否相同
	//花色与牌面值都相同,则为相同的牌
 	@Override
	public boolean equals(Object o) {
		if (this == 0) {
			return true;
		} 
		if (o == null || !(o instanceof Card)) {
			return false;
		}
		Card c = (Card)o;
		return rank == c.rank&& suit.equals(c.suit);
	}
}
Card p = new Card(1, "♠");
Card q = new Card(1, "♠");
Card o = p;
p == o; // true
p == q; // false
p.equals(o); // true
p.equals(q); //true

equals方法的注意事项:

  1. 如果指向同一个对象,返回true;
  2. 如果传入的对象为null,返回false;
  3. 如果传入的对象不是所要比较的对象的类型,返回false;
  4. equals方法要按照类的实现目标重写,完成对应的比较;
  5. 调用其他基本类型的比较也要使用equals方法,例如上述示例中suit的比较。

对象值大于、等于、小于的比较

认识comparable

comparable接口:通过compareTo(E o)方法实现对象值的比较。
返回值:

  • 小于0 :表示this指向的对象小于o所指向的对象;
  • == 0 :表示this指向的对象等于o所指向的对象;
  • 大于0 :表示this只想的对象大于o所指向的对象。
示例
public class Card implements Comparable<Card> {
	public int rank; // 数值
	public String suit; // 花色
	public Card(int rank, String suit) {
		this.rank = rank;
		this.suit = suit;
	} 
	// 根据数值比较,不管花色
	// 这里我们认为 null 是最小的
	@Override
	public int compareTo(Card o) {
		if (o == null) {
			return 1;
		} 
		return rank - o.rank;
	}
}
Card p = new Card(1, "♠");
Card q = new Card(2, "♠");
Card o = new Card(1, "♠");
p.compareTo(o); // == 0,表示牌相等
p.compareTo(q); // < 0,表示 p 比较小
q.compareTo(p); // > 0,表示 q 比较大

认识comparator

comparator接口:通过compare(T o1, T o2)方法实现对象值的比较。

  • 小于 0 :表示 o1 指向的对象小于 o2 指向的对象;
  • == 0 :表示 o1 指向的对象等于 o2 指向的对象;
  • 大于 0 :表示 o1 指向的对象等于 o2 指向的对象。
示例
public class Card implements Comparable<Card> {
	public int rank; // 数值
	public String suit; // 花色
	public Card(int rank, String suit) {
		this.rank = rank;
		this.suit = suit;
	}
}
public class CardComparator implements Comparator<Card> {
	// 根据数值比较,不管花色
	// 这里我们认为 null 是最小的
	@Override
	public int compare(T o1, T o2) {
		if (o1 == o2) {
			return 0;
		} 
		if (o1 == null) {
			return -1;
		} 
		if (o2 == null) {
			return 1;
		} 
		return o1.rank - o2.rank;
	}
}
Card p = new Card(1, "♠");
Card q = new Card(2, "♠");
Card o = new Card(1, "♠");
Comparator<Card> cmptor = new CardComparator();
cmptor.compare(p, o); // == 0,表示牌相等
cmptor.compareTo(p, q); // < 0,表示 p 比较小
cmptor.compareTo(q, p); // > 0,表示 q 比较大

总结

在进行用户自定义对象的大小比较时,需要重写比较的方法,具体重写的方法如下:
在这里插入图片描述

和java集合框架的配合
  1. 使用 contains 类似的方法,内部基本在调用元素的 equals 方法,所以要求元素覆写过 equals 方法
  2. 使用 HashMap,key 的比较内部会调用 equals 方法,所以要求元素覆写过 equals 方法
  3. 使用排序相关方法,内部需要进行比较,所以选择实现 Comparable 或者传入一个 Comparator
  4. 使用 TreeMap,key 需要进行大小比较,所以或者选择实现 Comparable 或者传入一个 Comparator
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值