对象的比较

值相等的比较

  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值