参考自xx_cc的简书文章
NSDictionary
NSDictionary以键值对的形式存储数据,唯一的key对应value,通过key来找到存储在字典中的value。NSDictionary字典一旦创建完毕,其键值对的个数就已经固定,无法删除,新增。
NSDictionart的创建
// key = name value = xx_cc ,前面的是value后面的是key
NSDictionary *dict =[NSDictionary dictionaryWithObjectsAndKeys:@"xx_cc",@"name",@"18",@"age", nil];
// 也可以通过快速创建 key:value
NSDictionary *dict2 = @{@"name":@"xx_cc",@"age":@"18"};
NSDiction的常用方法
@property (readonly) NSUInteger count; // 获取字典中键值对的个数
- (nullable ObjectType)objectForKey:(KeyType)aKey; // 获取键对应的值
@property (readonly, copy) NSArray<KeyType> *allKeys; // 获取所有的key
@property (readonly, copy) NSArray<ObjectType> *allValues; // 获取所有value
NSDictionary的遍历
除使用for in遍历之外,同样可以使用block进行遍历
[dict2 enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
// key 键 ,obj 值
}];
NSMutableDictionary
可变字典,相对于字典,可以进行键值对的删除和新增
NSMutableDictionary的常用方法
- (void)removeObjectForKey:(KeyType)aKey; //删除key对应的键值对
- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey; // 添加键值对
- (void)removeAllObjects; // 删除所有的键值对
- (void)removeObjectsForKeys:(NSArray<KeyType> *)keyArray; // 删除数组中所有key的键值对
NSDictionary数据持久化
- 将字典数组的信息保存到plist文件中
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- 从plist文件中还原回字典
+ (nullable NSDictionary<KeyType, ObjectType> *)dictionaryWithContentsOfFile:(NSString *)path;
NSDictionary字典数组存储数据的原理
当往字典数组中存储1个键值对的时候,这个键值对并不是按照顺序存储,存储键值对的时候,会根据键和数组的长度做1个哈希算法,算出1个下标,将这个键值对存储在该下标处。
取值的时候:也是根据键做1个哈希算法,就可以算出这个键值对存储的下标,然后直接找到这个下标的数据取出就可以了。
NSDictionary与NSArray对比
- 存储过程
- NSArray数组的元素按照顺序存储
- NSDictionary不是按照顺序存储的,存储的下标是通过哈希算法算出来的
- 存储的效率
- 存储的时候NSArray效率要高一些,因为NSArray不需要计算下标,直接往后存储即可
- 取值的效率
- 是将所有元素全部取出来,NSArray效率更高一些。
- 只取数组中指定的几个元素,字典数组取值更快一些。