天天看點

【Java資料結構】Java對象的比較

【Java資料結構】Java對象的比較

【Java資料結構】Java對象的比較

🎄元素比較

🛸基本類型的比較

🛸對象的比較

🎄對象如何進行比較

🛸覆寫基類的equal

🛸基于Comparble接口類的比較

🛸基于比較器的比較

🛸三種比較方式對比

🎄集合架構中PriorityQueue(優先級隊列)的比較方式

在Java中,基本類型的對象可以直接比較大小

【Java資料結構】Java對象的比較

先來看一段代碼
【Java資料結構】Java對象的比較

c1、c2和c3分别是Card類型的引用變量,上述代碼在比較編譯時:

c1 > c2 編譯失敗

c1== c2 編譯成功

c1 < c2 編譯失敗

從編譯結果可以看出,Java中引用類型的變量不能直接按照 > 或者 < 方式進行比較。

那為什麼== 可以比較?

因為:對于使用者實作自定義類型,都預設繼承自Object類,而Object類中提供了equal方法,而 equal方法 在不覆寫的情況下,預設用的就是 ==

【Java資料結構】Java對象的比較

該方法的比較規則是:

沒有比較引用變量引用對象的内容,而是直接比較引用變量的位址

但有些情況下用equals方法來比較就不符合題意。需要進行覆寫,修改成我們所需要的比較方法
有些情況下,需要比較的是對象中的内容,比如:
向優先級隊列中插入某個對象時,需要堆按照對象中内容來調整堆,那該如何處理呢?
以下提供三種比較對象的方式
【Java資料結構】Java對象的比較
注意: 一般覆寫 equals 的套路就是上面示範的
如果指向同一個對象,傳回 true
如果傳入的為 null,傳回 false
如果傳入的對象類型不是 Card,傳回 false
按照類的實作目标完成比較,例如這裡隻要花色和數值一樣,就認為是相同的牌
注意下調用其他引用類型的比較也需要 equals,例如這裡的 suit 的比較
覆寫基類equal的方式雖然可以比較,但缺陷是:equal隻能按照相等進行比較,不能按照大于、小于的方式進行比較。
【Java資料結構】Java對象的比較
對用

使用者自定義類型

,如果要想按照大小與方式進行比較時:在定義類時,

實作Comparble接口

即可,然後

在類中重寫compareTo方法

【Java資料結構】Java對象的比較

Compareble

java.lang

中的接口類,可以直接使用

Comparator

接口源碼如下:
【Java資料結構】Java對象的比較
按照比較器方式進行比較,具體步驟如下:
  1. 使用者自定義比較器類,實作

    Comparator接口

【Java資料結構】Java對象的比較
注意:區分

Comparable

Comparator

  1. 覆寫Comparator中的

    compare方法

【Java資料結構】Java對象的比較
調用自定義的比較器
【Java資料結構】Java對象的比較
注意:

Comparator

java.util 包

中的泛型接口類,

使用時必須導入對應的包

【Java資料結構】Java對象的比較
集合架構中的PriorityQueue底層使用堆結構,是以其内部的元素必須要能夠比大小,PriorityQueue采用了:Comparble和Comparator兩種方式。
Comparble是預設的内部比較方式,如果使用者插入自定義類型對象時,該類對象必須要實作Comparble接口,并覆寫compareTo方法
使用者也可以選擇使用比較器對象,如果使用者插入自定義類型對象時,必須要提供一個比較器類,讓該類實作Comparator接口并覆寫compare方法。
【Java資料結構】Java對象的比較