iOS 基础知识iOS 开发

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。

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

结论

  1. 在简单的保存和迭代下,NSArray比NSSet要快。保存(constructing)要快50%,但是迭代要快500%!如果你仅仅需要迭代,千万不要使用NSSet。如果你需要检索object,很明显NSSet要比NSArray要快!
  2. NSDictionary比NSMapTable在保存(construct)上要慢 - 因为NSDictionary需要拷贝key,但是查询比NSMapTable要快!当然在大多数情况,这2个类拥有的能力是不一样的,所以不应该因为在保存(construct)上有差异性而选择其中一个!

温馨提示:其实每个类的功能都不能用其它来代替,具体使用哪一个类完全取决于当时编码时的上下文!😁😁😁

上一篇下一篇

猜你喜欢

热点阅读