Answers:
当集合中项目的顺序不重要时,集合可提供更好的性能来查找集合中的项目。
原因是集合使用哈希值来查找项目(例如字典),而数组必须遍历其整个内容以找到特定的对象。
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]
最好的答案是苹果自己的文档。
主要区别在于NSArray
有序集合和NSSet
无序集合。
那里有几篇文章谈论这两者之间的速度差异,例如这篇文章。如果您要遍历无序集合,那就NSSet
太好了。但是,在许多情况下,您需要做只能做的事情NSArray
,因此您会牺牲这些能力的速度。
NSSet
NSArray
这就是全部!让我知道是否有帮助。
NSSet
为了索引而总是牺牲。对同一数据使用两种不同的数据结构是很常见的。或者,您可以在该数组上建立索引:)但是,最好使用已经实现了它的数据库。
NSSet
和NSArray
,因此我的回答是准确而完整的。是的,您可以构建其他数据结构,但是我只是比较这两个。
NSArray
和某些功能NSSet
,则正确的答案不是“使用NSArray
和牺牲性能”。答案是两者结合或使用不同的数据结构。
数组用于按项目索引访问项目。任何项目都可以多次插入数组。数组保留其元素的顺序。
集合基本上仅用于检查项目是否在集合中。这些项目没有顺序或索引的概念。您不能在集合中两次拥有一个项目。
如果数组要检查是否包含元素,则必须检查其所有项目。集被设计为使用更快的算法。
您可以想象一个像没有值的字典的集合。
注意,数组和集合不是唯一的数据结构。还有其他,例如队列,堆栈,堆,斐波那契堆。我建议阅读一本有关算法和数据结构的书。
有关更多信息,请参见Wikipedia。
contains
操作的复杂度为O(n)
。如果不在数组中,则比较次数为n
。对象在数组中时的平均比较数为n/2
。即使找到对象,性能也很糟糕。
NSArray
s比s具有其他速度优势NSSet
。与往常一样,这是一个折衷。
NSArray *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只是从数组中删除重复项,如:-
NSMutableSet *set=[[NSMutableSet alloc]initWithArray:duplicateValueArray]; // will remove all the duplicate values