Java对象比较方式:equals、Comparable与Comparator

806 字
4 分钟
Java对象比较方式:equals、Comparable与Comparator

我们就拿这个来举例:

public class Card{
public String suit;
public int rank;
public Card(String suit,int rank) {
this.suit = suit;
this.rank = rank;
}
public static void main(String[] args) {
Card card1 = new Card("hongtao", 5);
Card card2 = new Card("heitao", 5);
}

1.覆写基类的 equals#

当我们要判断两张牌是否相同时,需要比较的内容是 suit 以及 rank 两个属性

因此在比较是否相同上,我们通常用==进行比较,而在两个实例化的 card 中,则使用 euqals方法。

public class Card {
public String suit;
public int rank;
public Card(String suit,int rank) {
this.suit = suit;
this.rank = rank;
}
// 比较牌面、花色是否相同
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
Card card = (Card) o;
return rank == card.rank && Objects.equals(suit, card.suit);
}
@Override
public int hashCode() {
return Objects.hash(suit, rank);
}
}

重写 equals、hashCode 方法

在 IDEA 上,可以使用快捷键Alt+Ins,找到 equals 和 hashCode默认下一步即可

2.基于 Comparable 接口类的比较#

对用用户自定义类型,如果要想按照大小与方式进行比较时:在定义类时,实现Comparable接口即可,然后在类中重写compareTo方法

public class Card implements Comparable<Card> {
public String suit;
public int rank;
public Card(String suit,int rank) {
this.suit = suit;
this.rank = rank;
}
// 大小比较
@Override
public int compareTo(Card o) {
return this.rank - o.rank;
}
}

因此我们在只比较牌面大小的时候,可以通过重写compareTo方法即可。

其 return 有两种写法

return this.rank - o.rank;
return Integer.compare(this.rank, o.rank); // 更安全

该方法的返回值含义有以下:

public interface Comparable<E> {
// 返回值:
// < 0: 表示 this 指向的对象小于 o 指向的对象
// == 0: 表示 this 指向的对象等于 o 指向的对象
// > 0: 表示 this 指向的对象大于 o 指向的对象
int compareTo(E o);
}

3.基于比较器比较#

当用户自定义比较器的时候,实现这个接口并重写 compare 方法

例如,在该例子中我想比较花色,我们可以在 Card 类之外再创建一个类去实现该接口。减少对类的嵌入

comapre 方法内如何比较可自定义

class SuitComparator implements Comparator<Card> {
public int compare(Card o1,Card o2) {
return o1.suit.compareTo(o2.suit);
}
}

注意:Comparator 是 java.util 包中的泛型接口类,使用时必须导入对应的包。

该比较器的方法返回值如下:

public interface Comparator<T> {
// 返回值:
// < 0: 表示 o1 指向的对象小于 o2 指向的对象
// == 0: 表示 o1 指向的对象等于 o2 指向的对象
// > 0: 表示 o1 指向的对象等于 o2 指向的对象
int compare(T o1, T o2);
}

三种方式的对比#

特性Object.equalsComparableComparator
比较目的判断相等定义默认顺序定义多种/临时顺序
比较结果booleanint (负, 0, 正)int (负, 0, 正)
修改位置类内部类内部(实现接口)类外部(独立比较器)
灵活性中(一种规则固定)高(多种规则切换)
典型方法a.equals(b)a.compareTo(b)c.compare(a, b)

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Java对象比较方式:equals、Comparable与Comparator
https://sirens007.github.io/posts/guide8/objectsofcomparation/
作者
Sirens
发布于
2026-04-14
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Sirens
永遠相信,美好的事情即將發生
公告
欢迎来到我的博客!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
20
分类
2
标签
10
总字数
50,717
运行时长
0
最后活动
0 天前

目录