Java对象的比较有这三种,第一种equals
方法是对象值的比较,这是Object类提供的方法,第二种,第三种分别是实现Comparable
,Comparator
接口
- Object.equals
- Comparable
- Comparator
Object类equals方法
JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals
的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date
在这些类当中equals有其自身的实现(通过查看源码可以看到),而不再是比较类在堆内存中的存放地址了。
之前在String类中说过,==
是引用的比较,equals
方法是对象中的内容是否相等,但是对于下面这个代码,打印的是false,因为我们没有重写equals
方法,默认比较的就是地址
public class Card {
public int rank; // 数值
public String suit; // 花色
public Card(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
//如果是同一个对象返回true
//如果传入的是null,返回false
//如果传入的当前对象的类型不是当前类就返回false
//根据要求进行相等的逻辑判断
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Card card = (Card) o;
return rank == card.rank &&
Objects.equals(suit, card.suit);
}
public static void main(String[] args) {
Card p = new Card(1, "♠");
Card q = new Card(1, "♠");
System.out.println(p.equals(q));//false
System.out.println(p.equals(q));//true(重写equals方法)
}
}
Comparable接口
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;
}
// 根据数值比较,不管花色
@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, "♠");
System.out.println(p.compareTo(q));//-1
System.out.println(p.compareTo(o));//0
System.out.println(q.compareTo(o));//1
}
在自定义的类中,利用这种方法进行对象的比较
Comparator接口
public interface Comparator<T> {
// 返回值:
// < 0: 表示 o1 指向的对象小于 o2 指向的对象
// == 0: 表示 o1 指向的对象等于 o2 指向的对象
// > 0: 表示 o1 指向的对象等于 o2 指向的对象
int compare(T o1, T o2);
}
class Card {
public int rank; // 数值
public String suit; // 花色
public Card(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
}
public class myCompare implements Comparator<Card> {
// 根据数值比较,不管花色
// 这里我们认为 null 是最小的
@Override
public int compare(Card o1, Card o2) {
if (o1 == o2) {
return 0;
}
if (o1 == null) {
return -1;
}
if (o2 == null) {
return 1;
}
return o1.rank - o2.rank;
}
public static void main(String[] args) {
Card p = new Card(1, "♠");
Card q = new Card(2, "♠");
Card o = new Card(1, "♠");
Comparator<Card> m= new myCompare();
System.out.println(m.compare(p,q));//-1
System.out.println(m.compare(p,o));//0
System.out.println(m.compare(q,o));//1
}
}
总结
要比较自定义类的对象是否相等需要重写equals
()方法,假如要以某种依据来进行对象的比较,可以实现Comparable
接口或者Comparator
接口,通过代码可以看出,前者需要在类中进行实现,从而达到比较的目的,后者是在类外实现一个比较器,对对象进行比较,相对来说更灵活。