NSArray和NSMutableArray存储数据是将每一个元素挨个存储到数组中,但是NSMutableArray如果删除。新增元素后,这个元素后面的元素对应的下标就会发生变化,所以NSMutableArray的缺点时下标不可靠。为此Apple提供了一个新的类NSDictionary来解决这个问题,在存储数据到数组时,为存储到数组中每个元素取一个固定的别名(key)。NSDictionary(不可变字典集合)一旦创建完毕,其键值对的个数就固定了,并且无法删除,新增键值对。特别要注意的是键值对中的值只能是oc对象,键必须要是实现了NSCopying协议的oc对象。
-
#import <Foundation/Foundation.h>
-
-
int main()
-
{
-
@autoreleasepool {
-
-
NSDictionary* dict1 = [NSDictionary dictionary];
-
NSLog(@"%@", dict1);
-
-
-
NSDictionary* dict2 = [NSDictionary dictionaryWithObjectsAndKeys: @"jack", @"name", @"18", @"age", nil nil];
-
NSLog(@"%@", dict2);
-
-
-
NSDictionary* dict3 = @{@"name" : @"bowsloan", @"age" : @"23", };
-
NSLog(@"%@", dict3);
-
}
-
return 0;
-
}
存储原理:字典中的键值对仍然是以数组形式存储的,但并不是挨个存储。在往字典集合中存储数据的时候,会将key和数组长度根据哈希表算法计算出一个下标。取值的时候,也是将key和数组长度根据哈希算法计算出一个下标,然后根据下标取值。存的效率:NSArray效率更高。取的效率:如果把所有的数据一次性取出使用NSArray,如果只取出特定的元素使用NSDictionary
-
#import <Foundation/Foundation.h>
-
-
int main()
-
{
-
@autoreleasepool {
-
-
NSDictionary* dict1 = @{@"name" : @"bowsloan", @"age" : @"23", @"name" : @"baoshilong"};
-
NSLog(@"%@", dict1);
-
-
-
NSUInteger count = dict1.count;
-
NSLog(@"%lu", count);
-
-
-
NSString* name = [dict1 objectForKey: @"name"];
-
NSLog(@"%@", name);
-
-
-
NSString* age = dict1[@"age"];
-
NSLog(@"%@", age);
-
NSString* character = dict1[@"character"];
-
NSLog(@"%@", character);
-
-
-
for (id key in dict1) {
-
NSLog(@"%@ = %@", key, dict1[key]);
-
}
-
-
}
-
return 0;
-
}
建议:
“字典”(dictionary)是一种映射型数据结构,可向其中添加键值对。与数组一样,objective-c代码也经常用到字典。
一般我们创建一个字典数组采用的是如下这种方式:
-
<strong style="font-size:18px;"> </strong><span style="font-size:14px;">NSDictionary* personData = [NSDictionary dictionaryWithObjectsAndKeys: @"bowsloan", @"name", [NSNumber numberWithInt: 28], @"age", nil nil];</span>
这样的写法会很令人困惑,因为其顺序是<对象>,<键>,<对象>,<键>。这与通常理解的顺序相反。因此,这种写法不容易懂。所以,建议用字面量语法。如下:
-
<span style="font-size:14px;">NSDictionary* personData = @{@"name" : @"bowsloan", @"age" : @"23"};</span>
上面这种写法简明,而且键出现在对象之前,比较容易理解。此范例代码还说明了使用字面量数值的好处。字典中的对象和键都必须是objective-c对象,所以不能直接把整数23放进去,而要将其封装在NSNumber示例中才行。使用字面量语法很容易就能做到这一点,只需要给数字前面加一个@字符即可。
还有个好处就是字典数组与一般数组一样,用字面量语法创建字典时,一旦有值为nil,便会抛出异常。
字典也可以像数组那样用字面量语法访问,按照特定键访问其值的传统做法是:
-
<span style="font-size:14px;"> NSString* name = [personData objectForKey: @"name"];</span>
与之等效的字面量语法则是:
-
NSString* name = personData[@"name"];