iOS 字典的实现原理

486 阅读1分钟

一、Objective-C中的字典——NSDictionary

1.1 实现原理

NSDictionary底层使用哈希表(NSHashTable)来实现,哈希表本质上是一个数组,数组中的每一个元素被称为一个箱子(bin),箱子中存放着键值对(key-value)。
实际的存储过程为:

  • 使用哈希函数对key值进行计算,得出哈希值;
  • 假设哈希表的数组长度,即箱子个数为n,则该键值对应该存放在第(h%n)个箱子中;
  • 如果产生了哈希冲突,则使用 链地址法 处理;
  • 如果装载因子(总键值对数/箱子个数)过高,则应该进行扩容(创建两倍于原来的箱子个数);
  • 由于箱子个数发生变化(n变化),原来计算的键值对的存储位置均失效,则应该进行重哈希(对原有数据重新进行哈希运算)。

1.2 哈希扩容后一定能提高查询效率吗?

虽然一定会减小装载因子,但不一定能提高查询效率。假设所有key的哈希值都一样(全部都哈希冲突),那么即使扩容后它们仍会是一个长长的链条(存放位置可能变化),那么就不能提高查询效率。

二、Swift中的字典——Dictionary

2.1 实现原理

与oc的区别主要在于底层采用哈希表(HashTable)实现,在处理哈希冲突时采用 线性探测的开放定址法

2.2 如何使自定义类型可以作为hash表的key值

可以使自定义的类型实现Hashable协议。