文中只是我查询资料进行的一次总结。又不懂的可以私信我,或者查询原文。
NSDictionary 其实就是一个 hash 表。
哈希表通俗来讲就是一个链表,每个节点的下标是将对象地址通过哈希函数转换而来的,而这个节点的值就是一个数组。
而通过哈希函数得到的下标(hash 值)可能会造成冲突,所以会将 hash 值一样的对象存储到链表节点里面的数组中;NSObject 的 hash 函数是把对象的内存地址值作为 hash 值。
通过 hash 表来查找数据,会比数组高效很多,hash 表查询的时间复杂度为 O(1),而数组通过 for 循环查询的时间复杂度为 O(n)。
字典和数组一样,当存储对象时,都会将对象强引用一次。
当字典将对象作为 key 时,会先去执行对象的 hash 方法,从而得到hash 值,然后将对象深 copy 一次,和 value 一起存储在字典中。这也是为什么对象作为字典的 key 时,需要实现NSCopying 协议的原因。
- dic[key1]作为key去字典中查询value时,也会先计算hash值,来确定在hash表中的存储下标位置
- 因为存储散列碰撞的可能,所以找到下标后,会调用isEqual方法来匹配链表上面的各个元素之间的key值。当isEqual:返回YES时,会把对应的value返回。
- 调用父类的isEqual,NSObject的- (BOOL)isEqual:(id)object比较的是内存地址。
网友评论