Jawaban:
Jika urutan item dalam koleksi tidak penting, set menawarkan kinerja yang lebih baik untuk menemukan item dalam koleksi.
Alasannya adalah bahwa satu set menggunakan nilai hash untuk menemukan item (seperti kamus) sementara array harus mengulangi seluruh isinya untuk menemukan objek tertentu.
Gambar dari Dokumentasi Apple menggambarkannya dengan sangat baik:

Arrayadalah sebuah memerintahkan (agar dipertahankan ketika Anda menambahkan) urutan elemen
[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]
Setadalah daftar elemen yang berbeda (tidak ada duplikat) dan tidak berurutan
[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]
Jawaban terbaik untuk ini adalah dokumentasi Apple sendiri .

Perbedaan utamanya NSArrayadalah untuk koleksi yang dipesan dan NSSetuntuk koleksi yang tidak diurutkan .
Ada beberapa artikel di luar sana yang membahas tentang perbedaan kecepatan antara keduanya, seperti ini . Jika Anda mengulang melalui koleksi yang tidak diurutkan, NSSetitu bagus. Namun, dalam banyak kasus, Anda perlu melakukan hal-hal yang hanya NSArraydapat dilakukan, jadi Anda mengorbankan kecepatan untuk kemampuan tersebut.
NSSet
NSArray
Hanya itu yang benar-benar ada untuk itu! Beri tahu saya jika itu membantu.
NSSetdemi pengindeksan. Biasanya menggunakan dua struktur data yang berbeda untuk data yang sama. Atau Anda membangun dan mengindeks pada array tersebut :) Tapi lebih baik menggunakan DB yang sudah diimplementasikan.
NSSetdan NSArray, jawaban saya akurat dan lengkap. Ya, Anda dapat membangun struktur data lain, tetapi saya hanya membandingkan keduanya.
NSArraydan beberapa fungsi dari NSSet, jawaban yang benar bukanlah "menggunakan NSArraydan mengorbankan kinerja". Jawabannya adalah menggabungkan keduanya atau menggunakan struktur data yang berbeda.
Sebuah array digunakan untuk mengakses item dengan indeksnya. Item apa pun dapat dimasukkan ke dalam array beberapa kali. Array menjaga urutan elemennya.
Satu set pada dasarnya digunakan hanya untuk memeriksa apakah item tersebut ada dalam koleksi atau tidak. Item tidak memiliki konsep urutan atau pengindeksan. Anda tidak dapat memiliki item dalam satu set dua kali.
Jika sebuah array ingin memeriksa apakah mengandung sebuah elemen, ia harus memeriksa semua itemnya. Set dirancang untuk menggunakan algoritme yang lebih cepat.
Anda bisa membayangkan satu set seperti kamus tanpa nilai.
Perhatikan bahwa array dan set bukanlah satu-satunya struktur data. Ada yang lainnya, misal Queue, Stack, Heap, Fibonacci's Heap. Saya akan merekomendasikan membaca buku tentang algoritma dan struktur data.
Lihat wikipedia untuk informasi lebih lanjut.
containsoperasinya O(n). Jumlah perbandingan jika tidak ada dalam array n. Jumlah rata-rata perbandingan saat objek berada dalam larik adalah n/2. Bahkan jika objeknya ditemukan, kinerjanya buruk.
NSArrays memiliki keunggulan kecepatan lainnya dibandingkan NSSets. Seperti biasa, ini adalah pengorbanan.
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);
larik
04-12-2015 11: 05: 40,935 [598: 15730] (1, 2, 3, 4, 2, 1)
set
04-04-2015 11: 05: 43.362 [598: 15730] {(3, 1, 2, 5)}
Perbedaan utama telah diberikan dalam jawaban lain.
Saya hanya ingin mencatat bahwa karena cara set dan kamus diimplementasikan (yaitu menggunakan hash), seseorang harus berhati-hati untuk tidak menggunakan objek yang bisa berubah untuk kunci.
Jika kunci dimutasi maka hash (mungkin) juga akan berubah, menunjuk ke indeks / keranjang yang berbeda dalam tabel hash. Nilai asli tidak akan dihapus dan akan benar-benar diperhitungkan saat menghitung atau menanyakan struktur untuk ukuran / hitungannya.
Ini dapat menyebabkan beberapa bug sangat sulit ditemukan.
Di sini Anda dapat menemukan perbandingan yang cukup menyeluruh dari struktur data NSArraydan NSSet.
Kesimpulan singkat:
Ya, NSArray lebih cepat daripada NSSet karena hanya menahan dan mengulang. Lebih cepat 50% untuk membangun dan 500% lebih cepat untuk iterasi. Pelajaran: jika Anda hanya perlu mengulang konten, jangan gunakan NSSet.
Tentu saja, jika Anda perlu menguji inklusi, bekerja keras untuk menghindari NSArray. Bahkan jika Anda membutuhkan pengujian iterasi dan inklusi, Anda mungkin masih harus memilih NSSet. Jika Anda perlu menjaga agar koleksi Anda tetap teratur dan juga menguji penyertaan, Anda harus mempertimbangkan untuk menyimpan dua koleksi (NSArray dan NSSet), masing-masing berisi objek yang sama.
NSDictionary lebih lambat untuk dibuat daripada NSMapTable - karena perlu menyalin data kunci. Itu membuat ini dengan menjadi lebih cepat untuk mencari. Tentu saja, keduanya memiliki kemampuan yang berbeda sehingga seringkali penentuan ini harus dilakukan pada faktor-faktor lain.
Hanya untuk menambahkan sedikit saja saya menggunakan set kadang-kadang hanya untuk menghapus duplikat dari array seperti: -
NSMutableSet *set=[[NSMutableSet alloc]initWithArray:duplicateValueArray]; // will remove all the duplicate values