swift - Equatable,Hashable,Comparable

在java和Objective-C的世界里,都是重寫終極父類里面(Object和NSObject)里面重寫HashValue和isEqual來達到要求,這里就略過不談了。
(判斷2個對象相等)遵循的原則

  1. 如果兩個對象的hashValue不相等,則認為兩個對象不相等。反之相等,則跳轉(zhuǎn)到第2步
  2. 判斷2個對象是否相等(Swift-Equatable協(xié)議,Java和OC isEuqal),如果相等,則認為2個對象相等,反之則認為不相等。

總結(jié):用hashValue作為查詢條件,去HashTable中查找出符合條件的紀(jì)錄(對象),再用<code>相等</code>條件去對比。
優(yōu)點:避免用<code>相等</code>一個一個的去全局遍歷,提高效率

相等(Equatable)

在面向?qū)ο蟮氖澜缋?,總是有一個棧區(qū)引用指向堆區(qū)的一個對象,相等自然也變得復(fù)雜起來。

  • (==)默認是比較引用,實現(xiàn)Equatable協(xié)議后就是實現(xiàn)協(xié)議后的比較
  • (===)比較的是引用
class Person: Equatable {
    var name        = ""
    var age         = 0
}
func ==(m1:Person,m2:Person) -> Bool{
    return m1.name == m2.name && m1.age == m2.age
}

        let p1 = Person()
        p1.name = "liyang"
        p1.age  = 24
        
        let p2 = Person()
        p2.name = "liyang"
        p2.age  = 24
        
        print(p1 == p2)  //true
        print(p1 === p2) //false

哈希值(Hashable)

在計算機的世界里,哈希值用于快速定位和查找(用于Set里面的對象和Dictionary里面的作為key的對象,都需要實現(xiàn)(Hashable)協(xié)議)被哈希的對象。
好像是:內(nèi)部會維護一個HashTable的一個表(想象成數(shù)據(jù)庫的表),表類似于鍵值對的形式存在,hashValue就作為鍵(類似于帶有索引的一個沒有唯一約束的一個字段,注:并非主鍵,因為一個hashValue可能對應(yīng)多條記錄(也就是多個對象)。再判斷相等<code>用Equatable</code>)

自身實現(xiàn)hashValue是一個很復(fù)雜的過程,自定義對象實現(xiàn)hashValue的時候可通過系統(tǒng)已經(jīng)實現(xiàn)hashValue,來橋接實現(xiàn)

eg:

class Person: Hashable {
    var name        = ""
    var age         = 0
    var hashValue: Int{//hashValue的實現(xiàn)
        return self.name.hashValue ^ self.age.hashValue
    }
}
func ==(m1:Person,m2:Person) -> Bool{
    return m1.name == m2.name && m1.age == m2.age
}

比較(Comparable)

只要實現(xiàn)Comparable協(xié)議就好

class Person: Comparable {
    var name        = ""
    var age         = 0
    
}
func ==(m1:Person,m2:Person) -> Bool{
    return m1.name == m2.name && m1.age == m2.age
}
//具體邏輯就忽略不實現(xiàn)了,很簡單,具體業(yè)務(wù),具體實現(xiàn)
func <= (m1:Person,m2:Person) -> Bool{
    return m1.name == m2.name && m1.age == m2.age
}
func < (m1:Person,m2:Person) -> Bool{
    return m1.name == m2.name && m1.age == m2.age
}
func >= (m1:Person,m2:Person) -> Bool{
    return m1.name == m2.name && m1.age == m2.age
}
func > (m1:Person,m2:Person) -> Bool{
    return m1.name == m2.name && m1.age == m2.age
}

附注(翻譯自):

哈希表(HashTable)的概念

一般的線性表(想想成一般的數(shù)據(jù)庫結(jié)構(gòu)表就可以了)

eg:假設(shè)對象有<code>前面是對象,括號里是對應(yīng)的哈希值</code>:Obejct1(1),Obejct2(2),Obejct3(3),Obejct4(4),Obejct5(1)

主鍵 哈希值 對應(yīng)的對象
1 1 Object1
2 2 Object2
3 3 Object3
4 4 Object4
5 1 Object5

可從上面的哈希表中很清楚的看出Object1和Object5的哈希值是一樣的

當(dāng)這5個對象在一個集合(Dictinary and Set)中的時候。

假設(shè)<code>Set</code>中,再次往集合中放入Object1

  1. 取出Object1的哈希值
  2. 得到的哈希值在哈希表中進行檢索,只有2條記錄滿足條件(1,5)
  3. 得到的2個對象,再用<code>相等協(xié)議</code>去比較相等

總結(jié):大大提高效率,避免了全部遍歷的冗余。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,886評論 0 11
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,761評論 11 349
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,627評論 18 399
  • 前面已經(jīng)介紹完了Collection接口下的集合實現(xiàn)類,今天我們來介紹Map接口下的兩個重要的集合實現(xiàn)類HashM...
    Ruheng閱讀 10,540評論 2 38
  • 01 “老婆,你好像不開心啊?!?“嗯……” “為什么?” “不為什么?” “你別每次都這樣,不開心又不說,然后又...
    如此且行閱讀 352評論 0 2

友情鏈接更多精彩內(nèi)容