一、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协议。