When is it better to use an NSSet over an NSArray?

| | August 4, 2015

I have used NSSets many times in my apps, but have never created one myself.

My question is:

When is it better to use a NSSet as opposed to a NSArray and why?

6 Responses to “When is it better to use an NSSet over an NSArray?”

  1. The main differences have already been given in other answers.

    I’d just like to note that because of the way sets and dictionaries are implemented (i.e. using hashes),one should be careful not to use mutable objects for the keys.

    If a key is mutated then the hash will (probably) change too, pointing to a different index/bucket in the hash table. The original value won’t be deleted and will actually be taken into account when enumerating or asking the structure for its size/count.

    This can lead to some really hard to locate bugs.

  2. The image from Apple’s Documentation describes it very well:

    Objective-C Collections

    Array is an ordered (order is maintained when you add) sequence of elements

    [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 is a distinct (no duplicates), unordered list of elements

    [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]
    
  3. The best answer is to this is Apple’s own documentation.

    enter image description here

    The main difference is that NSArray is for an ordered collection and NSSet is for an unordered collection.

    There are several articles out there that talk about the difference in speed between the two, like this one. If you’re iterating through an unordered collection, NSSet is great. However, in many cases, you need to do things that only an NSArray can do, so you sacrifice the speed for those abilities.

    NSSet

    • Primarily access items by comparison
    • Unordered
    • Does not allow duplicates

    NSArray

    • Can access items by index
    • Ordered
    • Allows duplicates

    That’s all there really is to it! Let me know if that helps.

  4. When the order of the items in the collection is not important, sets offer better performance for finding items in the collection.

    The reason is that a set uses hash values to find items (like a dictionary) while an array has to iterate over its entire contents to find a particular object.

  5. NSOrderedSet is available in iOS 5+ so with that the main difference becomes whether you want duplicate objects in the data structure.

  6. An array is used to access items by their index. Any item can be inserted into the array multiple times. Arrays mantain the order of their elements.

    A set is used basically only to check if the item is in the collection or not. The items have no concept of order or indexing. You cannot have an item in a set twice.

    If an array wants to check if it contains an element, it has to check all its items. Sets are designed to use faster algorithms.

    You can imagine a set like a dictionary without values.

    Note that array and set are not the only data structures. There are other, e.g. Queue, Stack, Heap, Fibonacci’s Heap. I would recommend reading a book about algorithms and data structures.

    See wikipedia for more information.

Leave a Reply