📢博客主頁:🏀敲代碼的布萊恩特🏀
📢歡迎點贊 👍 收藏 ?留言 📝 歡迎討論!👏
📢本文由 【敲代碼的布萊恩特】 原創,首發于 CSDN🙉🙉🙉
📢由于博主是在學小白一枚,難免會有錯誤,有任何問題歡迎評論區留言指出,感激不盡!?
📖精品專欄(不定時更新)【JavaSE】 【Java資料結構】【LeetCode】
【Java資料結構】Java物件的比較
- 🎄元素比較
- 🛸基本型別的比較
- 🛸物件的比較
- 🎄物件如何進行比較
- 🛸覆寫基類的equal
- 🛸基于Comparble介面類的比較
- 🛸基于比較器的比較
- 🛸三種比較方式對比
- 🎄集合框架中PriorityQueue(優先級佇列)的比較方式
🎄元素比較
🛸基本型別的比較
在Java中,基本型別的物件可以直接比較大小
public class TestCompare {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a > b);
System.out.println(a < b);
System.out.println(a == b);
char c1 = 'A'; char c2 = 'B';
System.out.println(c1 > c2);
System.out.println(c1 < c2);
System.out.println(c1 == c2);
boolean b1 = true; boolean b2 = false;
System.out.println(b1 == b2);
System.out.println(b1 != b2);
}
}
🛸物件的比較
先來看一段代碼
class Card {
public int rank; // 數值
public String suit; // 花色
public Card(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
}
public class TestPriorityQueue {
public static void main(String[] args) {
Card c1 = new Card(1, "?");
Card c2 = new Card(2, "?");
Card c3 = c1;
//System.out.println(c1 > c2); // 編譯報錯
System.out.println(c1 == c2);
// 編譯成功 ----> 列印false,因為c1和c2指向的是不同物件
//System.out.println(c1 < c2); // 編譯報錯
System.out.println(c1 == c3);
// 編譯成功 ----> 列印true,因為c1和c3指向的是同一個物件
}
}
c1、c2和c3分別是Card型別的參考變數,上述代碼在比較編譯時:
- c1 > c2 編譯失敗
- c1== c2 編譯成功
- c1 < c2 編譯失敗
從編譯結果可以看出,Java中參考型別的變數不能直接按照 > 或者 < 方式進行比較,
那為什么== 可以比較?
因為:對于用戶實作自定義型別,都默認繼承自Object類,而Object類中提供了equal方法,而equal方法在不覆寫的情況下,默認用的就是==
該方法的比較規則是:
沒有比較參考變數參考物件的內容,而是直接比較參考變數的地址
但有些情況下用equals方法來比較就不符合題意,需要進行覆寫,修改成我們所需要的比較方法
🎄物件如何進行比較
有些情況下,需要比較的是物件中的內容,比如:
- 向優先級佇列中插入某個物件時,需要堆
按照物件中內容來調整堆,那該如何處理呢?
以下提供
三種比較物件的方式
🛸覆寫基類的equal
public class Card {
public int rank; // 數值
public String suit; // 花色
public Card(int rank, String suit) {
this.rank = rank; this.suit = suit;
}
@Override public boolean equals(Object o) {
// 自己和自己比較
if (this == o) {
return true;
}
// o如果是null物件,或者o不是Card的子類
if (o == null || !(o instanceof Card)) {
return false;
}// 注意基本型別可以直接比較,但參考型別最好呼叫其equal方法
Card c = (Card)o;
return rank == c.rank && suit.equals(c.suit);
}
}
注意: 一般
覆寫 equals的套路就是上面演示的
- 如果指向同一個物件,回傳 true
- 如果傳入的為 null,回傳 false
- 如果傳入的物件型別不是 Card,回傳 false
- 按照類的實作目標完成比較,例如這里只要花色和數值一樣,就認為是相同的牌
- 注意下呼叫其他參考型別的比較也需要 equals,例如這里的 suit 的比較
覆寫基類equal的方式雖然可以比較,但缺陷是:equal只能按照相等進行比較,不能按照大于、小于的方式進行比較,
🛸基于Comparble介面類的比較
Comparble是JDK提供的泛型的比較介面類,原始碼實作具體如下:
對用用戶自定義型別,如果要想按照大小與方式進行比較時:在定義類時,實作Comparble介面即可,然后在類中重寫compareTo方法,
public class Card implements Comparable<Card> {
public int rank; // 數值
public String suit; // 花色
public Card(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
// 根據數值比較,不管花色
// 這里我們認為 null 是最小的
@Override
public int compareTo(Card o) {
if (o == null) {
return 1;
}
return rank - o.rank;
}
public static void main(String[] args) {
Card p = new Card(1, "?");
Card q = new Card(2, "?");
Card o = new Card(1, "?");
System.out.println(p.compareTo(o));
// == 0,表示牌相等 System.out.println(p.compareTo(q));
// < 0,表示 p 比較小 System.out.println(q.compareTo(p));
// > 0,表示 q 比較大
}
}
Compareble是java.lang中的介面類,可以直接使用
🛸基于比較器的比較
Comparator介面原始碼如下:

按照比較器方式進行比較,具體步驟如下:
- 用戶自定義比較器類,實作
Comparator介面
class CardComparator implements Comparator<Card> {
// 根據數值比較,不管花色
// 這里我們認為 null 是最小的
********************
//覆寫代碼區
********************
}
注意:區分
Comparable和Comparator,
- 覆寫Comparator中的
compare方法
@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, "?"); // 定義比較器物件
CardComparator cmptor = new CardComparator();
// 使用比較器物件進行比較
System.out.println(cmptor.compare(p, o)); // == 0,表示牌相等
System.out.println(cmptor.compare(p, q)); // < 0,表示 p 比較小
System.out.println(cmptor.compare(q, p)); // > 0,表示 q 比較大
}
注意:
Comparator是java.util 包中的泛型介面類,使用時必須匯入對應的包,
🛸三種比較方式對比
| 覆寫的方法 | 說明 |
|---|---|
| Object.equals | 因為所有類都是繼承自 Object 的,所以直接覆寫即可,不過只能比較相等與否 |
| Comparable.compareTo | 需要手動實作介面,侵入性比較強,但一旦實作,每次用該類都有順序,屬于內部順序 |
| Comparator.compare | 需要實作一個比較器物件,對待比較類的侵入性弱,但對演算法代碼實作侵入性強 |
🎄集合框架中PriorityQueue(優先級佇列)的比較方式
集合框架中的PriorityQueue底層使用堆結構,因此其內部的元素必須要能夠比大小,PriorityQueue采用了:Comparble和Comparator兩種方式,
Comparble是默認的內部比較方式,如果用戶插入自定義型別物件時,該類物件必須要實作Comparble介面,并覆寫compareTo方法- 用戶也可以選擇使用比較器物件,如果用戶插入自定義型別物件時,
必須要提供一個比較器類,讓該類實作Comparator介面并覆寫compare方法,

🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙
?原創不易,如有錯誤,歡迎評論區留言指出,感激不盡?
? 如果覺得內容不錯,給個三連不過分吧~ ?
? 看到會回訪~ ?
🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙🌙
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/379538.html
標籤:java
上一篇:一文學會多執行緒



