- 对象的比较
- 比较身份:==
- 比较值:equals(需要手动重写才能按值比较)
- 比较类型:instanceof
equals如果没有重写,默认执行的是object中的equals,比较规则也是在比较身份
- 使用comparable接口时,最好指定泛型参数,编译器自动完成类型校验工作。不写参数的话默认为object,则需要手动类型转换。
- 使用comparable,必须让要比较的类实现comparable接口,需要修改代码。
- 使用比较器comparator,不需要修改代码,重新创建一个类,实现comparator接口。
- 为什么有了comparable,还要有comparator?
- comparable使用时必须要修改带比较类的代码,实际开发中,不是所有类都可以修改原码。
- comparable只能定义一种比较规则, comparator可以定义多种。
class Card implements Comparable{ public String rank; public String suit; public Card(String rank, String suit) { this.rank = rank; this.suit = suit; } @Override public int compareTo(Card o) { if (o == null) { //一般认为null值最小 return 1; } //点数取值 int rank1 = this.getValue(); int rank2 = o.getValue(); return rank1 - rank2; } public int getValue() { //把string类型的rank转换成数字点数 int value = 0; if ("J".equals(rank)) { value = 11; } else if ("Q".equals(rank)) { value = 12; } else if ("K".equals(rank)) { value = 13; } else if ("A".equals(rank)) { value = 1; }else{ //字符串转为整数 value = Integer.parseInt(rank); } return value; } @Override public boolean equals(Object obj) { //按照值来比较this和obj //1.自己和自己比较的情况,== 比较身份 if (this == obj) { return true; } //2.obj为null结果为false if (obj == null) { return false; } //3.obj这个类型是不是当前card类型 if (!(obj instanceof Card)){ return false; } //4.真正的比较内容 Card other = (Card)obj; return this.rank.equals(other.rank) && this.suit.equals(other.suit); } } class CardComparator implements Comparator { @Override public int compare(Card o1, Card o2) { if (o1 == o2) { return 0; } if (o1 == null) { return -1; } if (o2 == null) { return 1; } int value1 = o1.getValue(); int value2 = o2.getValue(); return value1 - value2; } } public class testCompare { public static void main(String[] args) { Card p = new Card("6","♦"); Card q = new Card("K","♦"); Card w = p; CardComparator comparator = new CardComparator(); System.out.println(comparator.compare(p,q)); } }



