使用NSSet
作为NSMutableDictionary
中的关键字是否有任何缺点,任何需要注意的问题,任何巨大的性能命中?
我认为密钥是在Cocoa容器中复制的,是否意味着NSSet被复制到字典?或者是否存在一些在这种情况下保留NSSet的优化?
与Can a NSDictionary take in NSSet as key?
相关示例代码:
NSMutableDictionary * dict = [NSMutableDictionary dictionary];
NSSet * set;
set = [NSSet setWithObjects:@"a", @"b", @"c", @"d", nil];
[dict setObject:@"1" forKey:set];
set = [NSSet setWithObjects:@"b", @"c", @"d", @"e", nil];
[dict setObject:@"2" forKey:set];
id key;
NSEnumerator * enumerator = [dict keyEnumerator];
while ((key = [enumerator nextObject]))
NSLog(@"%@ : %@", key, [dict objectForKey:key]);
set = [NSSet setWithObjects:@"c", @"b", @"e", @"d", nil];
NSString * value = [dict objectForKey:set];
NSLog(@"set: %@ : key: %@", set, value);
输出:
2009-12-08 15:42:17.885 x[4989] (d, e, b, c) : 2
2009-12-08 15:42:17.887 x[4989] (d, a, b, c) : 1
2009-12-08 15:42:17.887 x[4989] set: (d, e, b, c) : key: 2
答案 0 :(得分:4)
我认为密钥是在Cocoa容器中复制的,是否意味着NSSet被复制到字典?或者是否存在一些在这种情况下保留NSSet的优化?
NSDictionaries会复制他们的密钥。
不可变集可能会通过返回自身来回复copy
,使“副本”几乎是免费的。
一个可变集将通过返回自身的副本来响应copy
,这就是为什么使用可变对象作为键通常是一个坏主意(在变异之后你将无法找到它,因为它不再比较等于字典中的键。)
答案 1 :(得分:3)
哦。是。性能下降很大。 -[NSSet hash]
实施为[set count]
。这意味着,如果你的所有集合都有2个对象,那么它们都具有相同的散列,并且集合的执行效果非常差。