Pixiv - KiraraShss
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.equals | Comparable | Comparator |
|---|---|---|---|
| 比较目的 | 判断相等 | 定义默认顺序 | 定义多种/临时顺序 |
| 比较结果 | boolean | int (负, 0, 正) | int (负, 0, 正) |
| 修改位置 | 类内部 | 类内部(实现接口) | 类外部(独立比较器) |
| 灵活性 | 低 | 中(一种规则固定) | 高(多种规则切换) |
| 典型方法 | a.equals(b) | a.compareTo(b) | c.compare(a, b) |
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
Java对象比较方式:equals、Comparable与Comparator
https://sirens007.github.io/posts/guide8/objectsofcomparation/ 相关文章 智能推荐
1
Java 包装类、泛型与类型擦除
开发 系统梳理 Java 包装类与泛型机制,从装箱拆箱到泛型用法,深入解析类型擦除原理与编译期行为,理解泛型的底层本质.
2
七大经典排序算法:原理、实现与复杂度分析
开发 汇总常见七种排序算法的基本思想、实现过程与时间复杂度,并结合代码示例对比不同排序方法的适用场景.
3
栈与队列:概念、实现与典型应用
开发 梳理 Java 中栈(Stack)与队列(Queue)的基础概念,包含物理结构对比、用数组模拟实现循环队列,以及有效的括号等经典 LeetCode 题解思路.
4
二叉树知识整理:结构、性质与遍历实现
开发 从树的基础概念出发,系统总结二叉树的结构特点、性质推导、存储方式以及多种遍历实现方法.
5
算法复杂度评价标准与平均情况计算
开发 系统讲解时间与空间复杂度,从大 O 表示法到典型算法推导,重点分析平均时间复杂度的计算方法与实际案例.
随机文章 随机推荐