美文网首页iOS 基础知识iOS 开发
NSArray VS NSSet和NSDictionary VS

NSArray VS NSSet和NSDictionary VS

作者: 三角君 | 来源:发表于2016-02-29 13:59 被阅读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

    结论

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

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

    相关文章

      网友评论

        本文标题:NSArray VS NSSet和NSDictionary VS

        本文链接:https://www.haomeiwen.com/subject/sosgkttx.html