这张来自苹果官方文档的图片描述得非常清楚:
Array
是一个有序(添加元素时保持顺序)的元素序列。
[array addObject:@1];
[array addObject:@2];
[array addObject:@3];
[array addObject:@4];
[array addObject:@6];
[array addObject:@4];
[array addObject:@1];
[array addObject:@2];
[1, 2, 3, 4, 6, 4, 1, 2]
Set
是一个独特的(没有重复项),无序的元素列表
[set addObject:@1];
[set addObject:@2];
[set addObject:@3];
[set addObject:@4];
[set addObject:@6];
[set addObject:@4];
[set addObject:@1];
[set addObject:@2];
[1, 2, 6, 4, 3]
当集合中的项目顺序不重要时,使用集合可以更快地查找项目。
原因是集合使用哈希值来查找项目(类似于字典),而数组必须遍历整个内容才能找到特定的对象。
NSSet
。使用两种不同的数据结构来处理相同的数据是很常见的。或者你可以在数组上建立索引 :) 但是这时最好使用已经实现了它的数据库。 - SulthanNSSet
和 NSArray
,我的回答是准确和完整的。是的,你可以构建其他数据结构,但我只是在比较这两个。 - wozNSArray
获取一些功能,同时又需要从NSSet
获取一些功能,正确的答案不是“使用NSArray
并牺牲性能”。正确的答案是将两者结合起来或使用不同的数据结构。 - SulthanNSOrderedSet在iOS 5+中可用,因此主要区别在于您是否希望数据结构中存在重复对象。
NSArray:
NSSet:
contains
操作的复杂度为O(n)
。当不在数组中时,比较次数为n
。当对象在数组中时,平均比较次数为n/2
。即使找到了对象,性能也很差。 - SulthanNSArray
比NSSet
具有其他速度优势。像往常一样,这是一个权衡取舍。 - FreeAsInBeerNSArray *Arr;
NSSet *Nset;
Arr=[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"2",@"1", nil];
Nset=[NSSet setWithObjects:@"1",@"2",@"3",@"3",@"5",@"5", nil];
NSLog(@"%@",Arr);
NSLog(@"%@",Nset);
数组
2015-12-04 11:05:40.935 [598:15730] (1, 2, 3, 4, 2, 1)
集合
2015-12-04 11:05:43.362 [598:15730] {(3, 1, 2, 5)}
这里你可以找到一个相当详细的NSArray
和NSSet
数据结构的比较。
简短的结论:
是的,对于简单地持有和迭代,
NSArray
比NSSet
更快。构造速度最多快50%,迭代速度最多快500%。教训:如果您只需要迭代内容,请不要使用NSSet
。当然,如果您需要进行包含测试,则应避免使用
NSArray
。即使您需要迭代和包含测试,您仍然应该选择NSSet
。如果您需要保持集合有序并且还需要进行包含测试,则应考虑保留两个集合(一个NSArray
和一个NSSet
),每个集合都包含相同的对象。
NSDictionary
的构造速度比NSMapTable
慢,因为它需要复制键数据。但是,由于它查找速度更快,所以它弥补了这一点。当然,两者具有不同的功能,因此大多数情况下,这种决定应基于其他因素。
当访问速度至关重要且顺序无关紧要,或者由其他方式(通过谓词或排序描述符)确定顺序时,通常会使用Set。例如,Core Data在通过“一对多”关系访问托管对象时使用集合。