值相等的比较
- ==操作:p==q表示p和q两个引用指向同一个对象。
- 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方法的注意事项:
- 如果指向同一个对象,返回true;
- 如果传入的对象为null,返回false;
- 如果传入的对象不是所要比较的对象的类型,返回false;
- equals方法要按照类的实现目标重写,完成对应的比较;
- 调用其他基本类型的比较也要使用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集合框架的配合
- 使用 contains 类似的方法,内部基本在调用元素的 equals 方法,所以要求元素覆写过 equals 方法
- 使用 HashMap,key 的比较内部会调用 equals 方法,所以要求元素覆写过 equals 方法
- 使用排序相关方法,内部需要进行比较,所以选择实现 Comparable 或者传入一个 Comparator
- 使用 TreeMap,key 需要进行大小比较,所以或者选择实现 Comparable 或者传入一个 Comparator