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));
}
}