目录
对象值相等的比较
对象值大于、等于、小于的比较
比较
== VS equals():
p == q 表示的是 p 和 q 两个引用指向同一个对象;p.equals(q) 表示 p 指向的对象 和 q 指向的对象是否是值语义相等的。 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); // trueComparable<E>:
public interface Comparable<E> { // 返回值: // < 0: 表示 this 指向的对象小于 o 指向的对象 // == 0: 表示 this 指向的对象等于 o 指向的对象 // > 0: 表示 this 指向的对象等于 o 指向的对象 int compareTo(E 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<T>:
public interface Comparator<T> { // 返回值: // < 0: 表示 o1 指向的对象小于 o2 指向的对象 // == 0: 表示 o1 指向的对象等于 o2 指向的对象 // > 0: 表示 o1 指向的对象等于 o2 指向的对象 int compare(T o1, T o2); } 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 比较大需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性强