在java和Objective-C的世界里,都是重写终极父类里面(Object和NSObject)里面重写HashValue和isEqual来达到要求,这里就略过不谈了。
(判断2个对象相等)遵循的原则
- 如果两个对象的hashValue不相等,则认为两个对象不相等。反之相等,则跳转到第2步
- 判断2个对象是否相等(Swift-Equatable协议,Java和OC isEuqal),如果相等,则认为2个对象相等,反之则认为不相等。
总结:用hashValue作为查询条件,去HashTable中查找出符合条件的纪录(对象),再用<code>相等</code>条件去对比。
优点:避免用<code>相等</code>一个一个的去全局遍历,提高效率
相等(Equatable)
在面向对象的世界里,总是有一个栈区引用指向堆区的一个对象,相等自然也变得复杂起来。
- (==)默认是比较引用,实现Equatable协议后就是实现协议后的比较
- (===)比较的是引用
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的对象,都需要实现(Hashable)协议)被哈希的对象。
好像是:内部会维护一个HashTable的一个表(想象成数据库的表),表类似于键值对的形式存在,hashValue就作为键(类似于带有索引的一个没有唯一约束的一个字段,注:并非主键,因为一个hashValue可能对应多条记录(也就是多个对象)。再判断相等<code>用Equatable</code>)
自身实现hashValue是一个很复杂的过程,自定义对象实现hashValue的时候可通过系统已经实现hashValue,来桥接实现
eg:
class Person: Hashable {
var name = ""
var age = 0
var hashValue: Int{//hashValue的实现
return self.name.hashValue ^ self.age.hashValue
}
}
func ==(m1:Person,m2:Person) -> Bool{
return m1.name == m2.name && m1.age == m2.age
}
比较(Comparable)
只要实现Comparable协议就好
class Person: Comparable {
var name = ""
var age = 0
}
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
}
func > (m1:Person,m2:Person) -> Bool{
return m1.name == m2.name && m1.age == m2.age
}
附注(翻译自):
哈希表(HashTable)的概念
一般的线性表(想想成一般的数据库结构表就可以了)
eg:假设对象有<code>前面是对象,括号里是对应的哈希值</code>:Obejct1(1),Obejct2(2),Obejct3(3),Obejct4(4),Obejct5(1)
主键 | 哈希值 | 对应的对象 |
---|---|---|
1 | 1 | Object1 |
2 | 2 | Object2 |
3 | 3 | Object3 |
4 | 4 | Object4 |
5 | 1 | Object5 |
可从上面的哈希表中很清楚的看出Object1和Object5的哈希值是一样的
当这5个对象在一个集合(Dictinary and Set)中的时候。
假设<code>Set</code>中,再次往集合中放入Object1
- 取出Object1的哈希值
- 得到的哈希值在哈希表中进行检索,只有2条记录满足条件(1,5)
- 得到的2个对象,再用<code>相等协议</code>去比较相等
总结:大大提高效率,避免了全部遍历的冗余。
网友评论