![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iMzUGOzQ2NjFTNhhTM5ADO0MTO0UmM5E2YyYTO0ITM48CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
【Java資料結構】Java對象的比較
🎄元素比較
🛸基本類型的比較
🛸對象的比較
🎄對象如何進行比較
🛸覆寫基類的equal
🛸基于Comparble接口類的比較
🛸基于比較器的比較
🛸三種比較方式對比
🎄集合架構中PriorityQueue(優先級隊列)的比較方式
在Java中,基本類型的對象可以直接比較大小
先來看一段代碼![]()
【Java資料結構】Java對象的比較 c1、c2和c3分别是Card類型的引用變量,上述代碼在比較編譯時:
c1 > c2 編譯失敗
c1== c2 編譯成功
c1 < c2 編譯失敗
從編譯結果可以看出,Java中引用類型的變量不能直接按照 > 或者 < 方式進行比較。
那為什麼== 可以比較?
因為:對于使用者實作自定義類型,都預設繼承自Object類,而Object類中提供了equal方法,而 equal方法 在不覆寫的情況下,預設用的就是 ==
![]()
【Java資料結構】Java對象的比較 該方法的比較規則是:
沒有比較引用變量引用對象的内容,而是直接比較引用變量的位址
但有些情況下用equals方法來比較就不符合題意。需要進行覆寫,修改成我們所需要的比較方法
有些情況下,需要比較的是對象中的内容,比如:
向優先級隊列中插入某個對象時,需要堆按照對象中内容來調整堆,那該如何處理呢?
以下提供三種比較對象的方式
注意: 一般覆寫 equals 的套路就是上面示範的![]()
【Java資料結構】Java對象的比較
如果指向同一個對象,傳回 true
如果傳入的為 null,傳回 false
如果傳入的對象類型不是 Card,傳回 false
按照類的實作目标完成比較,例如這裡隻要花色和數值一樣,就認為是相同的牌
注意下調用其他引用類型的比較也需要 equals,例如這裡的 suit 的比較
覆寫基類equal的方式雖然可以比較,但缺陷是:equal隻能按照相等進行比較,不能按照大于、小于的方式進行比較。
對用![]()
【Java資料結構】Java對象的比較 ,如果要想按照大小與方式進行比較時:在定義類時,
使用者自定義類型
即可,然後
實作Comparble接口
。
在類中重寫compareTo方法
![]()
【Java資料結構】Java對象的比較 是
Compareble
中的接口類,可以直接使用
java.lang
接口源碼如下:
Comparator
按照比較器方式進行比較,具體步驟如下:![]()
【Java資料結構】Java對象的比較
- 使用者自定義比較器類,實作
Comparator接口
注意:區分
![]()
【Java資料結構】Java對象的比較 和
Comparable
Comparator
- 覆寫Comparator中的
compare方法
調用自定義的比較器
![]()
【Java資料結構】Java對象的比較 注意:![]()
【Java資料結構】Java對象的比較
Comparator
中的泛型接口類,
java.util 包
使用時必須導入對應的包
![]()
【Java資料結構】Java對象的比較
集合架構中的PriorityQueue底層使用堆結構,是以其内部的元素必須要能夠比大小,PriorityQueue采用了:Comparble和Comparator兩種方式。
Comparble是預設的内部比較方式,如果使用者插入自定義類型對象時,該類對象必須要實作Comparble接口,并覆寫compareTo方法
使用者也可以選擇使用比較器對象,如果使用者插入自定義類型對象時,必須要提供一個比較器類,讓該類實作Comparator接口并覆寫compare方法。![]()
【Java資料結構】Java對象的比較