swift - Equatable,Hashable,Comparable

在java和Objective-C的世界里,都是重写终极父类里面(Object和NSObject)里面重写HashValue和isEqual来达到要求,这里就略过不谈了。
(判断2个对象相等)遵循的原则

  1. 如果两个对象的hashValue不相等,则认为两个对象不相等。反之相等,则跳转到第2步
  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

  1. 取出Object1的哈希值
  2. 得到的哈希值在哈希表中进行检索,只有2条记录满足条件(1,5)
  3. 得到的2个对象,再用<code>相等协议</code>去比较相等

总结:大大提高效率,避免了全部遍历的冗余。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 9,178评论 0 11
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,504评论 11 349
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,404评论 18 399
  • 前面已经介绍完了Collection接口下的集合实现类,今天我们来介绍Map接口下的两个重要的集合实现类HashM...
    Ruheng阅读 13,540评论 2 38
  • 01 “老婆,你好像不开心啊。” “嗯……” “为什么?” “不为什么?” “你别每次都这样,不开心又不说,然后又...
    如此且行阅读 2,490评论 0 2

友情链接更多精彩内容