iOS常用集合类的实现

这里梳理一下iOS常用集合类的实现,主要是以下几个:

  • NSMutableSet
  • NSMutableDictionary
  • NSMutableArray
  • NSOrderedSet

NSMutableSet & NSMutableDictionary

这两个都是hash表,没什么特殊的。set/get操作平均都是O(1)的。

hash冲突常见的两种处理方式是开放定址法和链地址法。

可以参考一下笔记-集合NSSet、字典NSDictionary的底层实现原理

NSMutableArray

NSMutableArray不是一个简单的数组,可以参考NSMutableArray原理揭露

它在实现中借助了一个环形缓冲区,实现了一个类似双向队列的结构。

我们借助一个在开头插入数据的例子理解一下:

iOS常用集合类的实现_第1张图片

如图,我们有一个[B,C,D,E]的NSMutableArray,此时它实际上在内存中的存储结构可能是[B,C,D,E,null,null],此时环形缓冲区的起始位置是实际存储中的index 0。希望在0处插入对象A,实际上会插在index 5,存储结构变成[B,C,D,E,null,A],此时环形缓冲区的起始位置是实际存储中的index 5。

这使得NSArray在开头和末尾插入效率都是O(1)的,而普通数组在开头的插入效率是O(N)的。

NSOrderedSet

没找到什么资料,简单想的话应该是存了个NSSet+NSArray?有数据更新的时候分别更新两份索引。


关于hash

NSObject有个属性:@property(readonly) NSUInteger hash;,NSSet/NSDictionary等hash表会使用这个属性判断两个对象是否一致,默认地,它就是对象的内存地址(参考)。但是如果这个对象是可以被修改的,并且你要的确实不是根据内存地址而是根据内容进行去重,那么就要手动实现hash和isEqual方法。

你可能感兴趣的:(ios)