NSArray VS NSSet和NSDictionary VS
2016-02-29 本文已影响286人
三角君
NSArray和NSSet、NSDictionary和NSMapTable的API极其相似,初学者经常容易混淆它们之间的区别,本文将对它们进行分析
首先我们来看几张图(图上包含了NSDictionary):
Apple Documents Network Documents Private Documents虽然我们看到了3个图,但其实表达的是同一个意思。
NSArray、NSSet使用例子
NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"2",@"1", nil];
NSSet *set = [NSSet setWithObjects:@"1",@"2",@"3",@"3",@"5",@"5", nil];
NSLog(@"%@",array);
NSLog(@"%@",set);
2016-02-29 13:05:02.607 MapTablePerformanceTest[3538:165061] (
1,
2,
3,
4,
2,
1
)
2016-02-29 13:05:02.608 MapTablePerformanceTest[3538:165061] {(
3,
1,
2,
5
)}
从Log我们可以很清晰的知道,NSArray会保存所有相同的object且有序,而NSSet会去掉重复的object且无序
总结
NSArray和NSSet最大的不同是,NSArray是有序集合,NSSet是无序集合。
NSSet
- 有唯一的对象
- 无序
- 通过对比来提取对象
NSArray
- 可以有相同的对象
- 有序
- 通过索引来提取对象
该如何选择NSArray或NSSet、NSDictionay或NSMapTable?
人生需要碰撞,碰着碰着就知道答案了
具体评测可参考:
NSArray or NSSet, NSDictionary or NSMapTable
NSMapTable: more than an NSDictionary for weak pointers
NSArray vs NSSet
- 构造
Test | Time taken for NSArray | Time taken for NSSet |
---|---|---|
Creating incrementally (capacity not set) | 0.582256 seconds | 2.67101 seconds |
Creating incrementally (capacity set correctly) | 0.572139 seconds | 0.930725 seconds |
Iterating contents | 0.004713 seconds | 0.025864 seconds |
另外NSSet的setWithArray:函数也是使用的"capacity not set",所以如果你知道数组中的object是唯一的,你最好是设置capacity,然后拷贝数据到NSSet。
- 查找 (测试是基于迭代10000次!迭代1000000次的话,indexOfObject我跑了10分钟也还没结束!!!)
Test | Time taken for NSArray | Time taken for NSSet |
---|---|---|
Searching for all objects | 29.2667 seconds (indexOfObject:) | 0.00833601 seconds |
Searching for all objects | 0.185051 seconds (indexOfObjectIdenticalTo:) | 0.00833601 seconds |
提示:indexOfObject:和indexOfObjectIdenticalTo:的时间差异还是非常明显的,是因为indexOfObject:是equal对象,而indexOfObjectIdenticalTo:是equal对象指针地址,那当然要快很多了!
NSDictionary vs NSMapTable
Test | Time taken for NSDictionary | Time taken for NSMapTable |
---|---|---|
Construction | 3.45922 seconds | 2.32607 seconds |
Iterating keys and querying each object | 0.60859 seconds | 0.770289 seconds |
结论
- 在简单的保存和迭代下,NSArray比NSSet要快。保存(constructing)要快50%,但是迭代要快500%!如果你仅仅需要迭代,千万不要使用NSSet。如果你需要检索object,很明显NSSet要比NSArray要快!
- NSDictionary比NSMapTable在保存(construct)上要慢 - 因为NSDictionary需要拷贝key,但是查询比NSMapTable要快!当然在大多数情况,这2个类拥有的能力是不一样的,所以不应该因为在保存(construct)上有差异性而选择其中一个!
温馨提示:其实每个类的功能都不能用其它来代替,具体使用哪一个类完全取决于当时编码时的上下文!😁😁😁