实现比较的方式一共有三种
- ==
- .equals
- Comparable
- Comparator
其中等号比较的是对象的身份,也就是它们的地址是否相同,.equals比较的是对象自身,Comparable和Comparator都是可以比较对象的大小关系,具体根据什么进行比较我们可以自己定义
一、==
class Card {
public String rank;//扑克牌的点数
public String suit;//扑克牌的花色
public Card(String rank, String suit) {
this.rank = rank;
this.suit = suit;
}
}
public class equals {
public static void main(String[] args) {
Card p = new Card("10","♥");
Card q = new Card("10","♥");
Card o = p;
System.out.println((p == q));//false
System.out.println((p == o));//true
}
}
这里的p和q指向的是两个不同的对象,地址也就不同,所以是false,p和o指向的是同一个对象,地址相同,也就是false
二、equals
class Card {
public String rank;//扑克牌的点数
public String suit;//扑克牌的花色
public Card(String rank, String suit) {
this.rank = rank;
this.suit = suit;
}
@Override
public boolean equals(Object obj) {
if(obj==null){//如果拿来比较的对象为null的话直接返回false
return false;
}
if(this==obj){//如果被比较的和拿来比较的是同一个对象返回true
return true;
}
if(!(obj instanceof Card)) {//如果它们的类型不一样的话也返回false
return false;
}
//接下来才是真正的比较两个对象的内容,其中的内容可以由我们自己定义根据什么比较‘
Card other = (Card)obj;//首先需要对obj由Object类型强转为Card类型
return (this.rank.equals(other.rank))&&(this.suit.equals(other.suit));//我们可以定义比较花色和点数
}
}
public class equals {
public static void main(String[] args) {
Card p = new Card("10","♥");
Card q = new Card("10","♥");
Card o = p;
System.out.println((p == q));//false
System.out.println((p == o));//true
System.out.println(("===================="));
System.out.println((p.equals(q)));//true
System.out.println((p.equals(o)));//true
}
}
使用equals的时候需要将它进行重写,不然的话会执行Object版本的equals,相当于还是按照==号在进行。重写的时候我们可以根据自己的要求来定义根据什么进行比较。
三、Comparable
Comparable是一个接口,需要我们实现它并且重写里面的comparaTo方法
class Card implements Comparable<Card> {//这里利用泛型我们就可以不用手动进行类型转换
public String rank;//扑克牌的点数
public String suit;//扑克牌的花色
public Card(String rank, String suit) {
this.rank = rank;
this.suit = suit;
}
@Override
public boolean equals(Object obj) {
if(obj==null){//如果拿来比较的对象为null的话直接返回false
return false;
}
if(this==obj){//如果被比较的和拿来比较的是同一个对象返回true
return true;
}
if(!(obj instanceof Card)) {//如果它们的类型不一样的话也返回false
return false;
}
//接下来才是真正的比较两个对象的内容,其中的内容可以由我们自己定义根据什么比较‘
Card other = (Card)obj;//首先需要对obj由Object类型强转为Card类型
return (this.rank.equals(other.rank))&&(this.suit.equals(other.suit));//我们可以定义比较花色和点数
}
@Override
public int compareTo(Card o) {
if(o==null){//此时代表拿来比较的对象为null
return 1;//默认为被比较对象大于拿来比较的对象,返回一个大于0的数字
}
int result1 = this.getvalue();
int result2 = o.getvalue();
return (result1-result2);
}
public int getvalue(){//通过这个方法我们可以把不能比较的转化为可以比较的自然数字
int val = 0;
if("j".equals(rank)){
val = 11;
}else if("Q".equals(rank)){
val = 12;
}else if("K".equals(rank)){
val = 13;
}else if("A".equals(rank)){
val = 14;
}else{
val = Integer.parseInt(rank);//如果rak是2到10的话,直接转化成数字
}
return val;
}
}
public class equals {
public static void main(String[] args) {
Card p = new Card("10","♥");
Card q = new Card("10","♥");
Card o = p;
System.out.println((p == q));//false
System.out.println((p == o));//true
System.out.println(("===================="));
System.out.println((p.equals(q)));//true
System.out.println((p.equals(o)));//true
System.out.println(("========================"));
System.out.println((p.compareTo(q)));//0
System.out.println((p.compareTo(o)));//0
}
}
在ComparaTo方法中我们可以自己定义i根据什么来进行比较,不能比较的我们可以利用一个方法将它转换为自然数字来进行比较
四、Comparator
Comparator和Comparable类似,区别在于我们再写一个类来实现这个接口,不需要修改待比较类中的代码,降低耦合度。
class cardComparator implements Comparator<card>{//comparator这个接口需要重新写一个类来实现比较,
@Override
public int compare(card o1, card o2) {//这里的这两个参数就相当于是comparable里面的this和O
//也就相当于是比较的那个元素和被比较的那个元素
if(o1==o2){
return 0;
}
if(o1==null){
return -1;
}
if(o2==null){
return 1;
}
int val1 = o1.getvalue();
int val2 = o2.getvalue();
return val1-val2;
}
相比于Comparable,Comparator会更灵活一点,可以创建多个类来定义多种比较规则,而且不需要修改待比较类中的代码,毕竟实际开发中不是所有的类我们都能随意修改的。