NSDictionary和NSMaptable, NSArray,NSSet,NSOrderedSet和NSHashTable的区别

NSDictionary和NSMaptable

1,NSMapTable对于NSDictionary来说,优点在于:可以指定key/value是需要strong,weak,甚至copy。如果为weak,当key或value被释放的时候,会自动从NSMapTable中移除这一项。

2,NSMapTable是可变的,不像NSDictionary还有个对应的NSMutableDictionary可变类。

3,NSDcitionary或者NSMutableDictionary中对于key和value的内存管理是,对key进行copy,对value进行强引用,所有,只有满足NSCopying协议的对象才能成为key值。NSMaptable可以通过弱引用来持有keys和values,所以当key或者value被deallocated的时候,所存储的实体也会被移除

4, NSDcitionary  key应该是轻量级的,通常是字符串或数字。但这个是key-to-object映射,而不是object-to-object.而NSMapTabTable更适合于我们一般所说的映射标准,它既可以处理key-to-value又可以处理object-to-object

NSMapTabTable对应object-to-object映射的应用

应用背景(我们定义一个Person类,用来记录人名,我们再创建一个Favourite类用来创建爱好对象,现在有Rose和Jack两个人,分别的爱好是ObjC和Swift,人和爱好必须要用对象实现,而且必须关联起来在一个表里,以便我们进行查询和记录。如果是以前的话需要自己建立一个Dictionary,把人名的name字段作为key,favourite的对象作为value。但是这样有一个问题,如果突然某一天,我Person里面增加了个字段age,我这个表还要记录每个人的年龄,供我以后来查询不同年龄段的人统计使用呢?这下就很尴尬了,因为Dicitionary没办法实现我们要的这个效果,NSMapTable可以实现)

Person *p1 = [[Person alloc] initWithName:@"jack"];

Favourite *f1 = [[Favourite alloc] initWithName:@"ObjC"];

Person *p2 = [[Person alloc] initWithName:@"rose"];

Favourite *f2 = [[Favourite alloc] initWithName:@"Swift"];

NSMapTable *MapTable = [NSMapTable mapTableWithKeyOptions:NSMapTableWeakMemory valueOptions:NSMapTableWeakMemory];

// 设置对应关系表

// p1 => f1;

// p2 => f2

[MapTable setObject:f1 forKey:p1];

[MapTable setObject:f2 forKey:p2];

NSArray,NSSet,NSOrderedSet和NSHashTable

1, NSArray是有序的集合,在内存中是连续存放的,NSSet是无序的,存储位置不连续

2, 在搜索一个一个元素时,NSSet比NSArray效率高,因为用了hash算法(散列),比如你要存储元素A,一个hash算法直接就能直接找到A应该存储的位置;同样,当你要访问A时,一个hash过程就能找到A存储的位置。而对于NSArray,若想知道A到底在不在数组中,则需要便利整个数组,显然效率较低了

3,NSMutableSet有几个很强大的方法,例如intersectSet:,minusSet:和unionSet:

4,NSOrderedSet,综合了NSArray和NSSet两者的好处,对象查找,对象唯一性,和快速随机访问,NSOrderedSet比NSSet和NSArray占用更多的内存,因为它需要一起维护哈希值和索引

5, NSHashTable是更广泛意义的NSSet,区别于NSSet / NSMutableSet, NSSet / NSMutableSet是对其成员的强类型引用,这些成员被通过hash方法和isEqual方法来完成哈希和对比功能,NSHashTable可以持有weak类型的成员变量。NSHashTable是根据一个option参数来进行初始化的,因为从OSX平台上移植到iOS平台上,原来OSX平台上使用的枚举类型被放弃了,从而用option来代替,命名也发生了一些变化:NSHashTableStrongMemory: 等同于NSPointerFunctionsStrongMemory. 对成员变量进行强引用。这是一个默认值。如果采用这个默认值,NSHashTable和NSSet就没什么区别了。NSHashTableWeakMemory: 等同于NSPointerFunctionsWeakMemory.对成员变量进行弱引用,NSHashTableCopyIn: 在对象被加入集合之前进行复制。

你可能感兴趣的:(NSDictionary和NSMaptable, NSArray,NSSet,NSOrderedSet和NSHashTable的区别)