如果我想为协议创建一个类型对象,则Dictionary<Key:Value>()
它是必需的。为什么会这样,字典是如何实现的?Key
Hashable
我的意思是我会理解,如果Key
只是需要符合Equatable
类型的协议,因为程序将不得不搜索相关的值,但是,var hashValue: Int
随之而来的额外Hashable
内容有点令人困惑
如果我想为协议创建一个类型对象,则Dictionary<Key:Value>()
它是必需的。为什么会这样,字典是如何实现的?Key
Hashable
我的意思是我会理解,如果Key
只是需要符合Equatable
类型的协议,因为程序将不得不搜索相关的值,但是,var hashValue: Int
随之而来的额外Hashable
内容有点令人困惑
可散列键使字典插入和查找更加高效,尤其是对于大型字典。
如果键不可散列,为了找到特定键,您必须(在最坏的情况下)读取并比较字典中的所有键是否相等。
可散列的键自然会按其哈希值划分为桶,要找到特定的键,您需要计算其哈希以确定它所在的桶,然后您只需要比较属于同一桶的相等键。如果哈希函数选择正确并且字典中的元素数小于最大值Int
,那么每个桶只有一个键的机会很大,从而使查找效率与 O(1) 一样高。
此相关问题中有更多信息。