在java和Objective-C的世界里,都是重寫終極父類里面(Object和NSObject)里面重寫HashValue和isEqual來達到要求,這里就略過不談了。
(判斷2個對象相等)遵循的原則
- 如果兩個對象的hashValue不相等,則認為兩個對象不相等。反之相等,則跳轉(zhuǎn)到第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
- 取出Object1的哈希值
- 得到的哈希值在哈希表中進行檢索,只有2條記錄滿足條件(1,5)
- 得到的2個對象,再用<code>相等協(xié)議</code>去比較相等
總結(jié):大大提高效率,避免了全部遍歷的冗余。