Masukkan Password
15 Difference between List & Set | Dart List vs Set | Dart tutorial #14
Video ini membahas perbandingan List dan Set di Dart berdasarkan beberapa faktor penting.
Ada satu hal yang perlu saya luruskan dari transkrip: video menyebut Set sebagai unordered collection. Untuk memahami Dart modern dengan tepat, lebih aman mengatakan bahwa Set bukan collection berbasis index dan tidak boleh diperlakukan seperti List. Implementasi Set default Dart, yaitu LinkedHashSet, biasanya mempertahankan urutan insertion, tetapi konsep utama Set tetap keunikan data, bukan posisi/index.
1. Gambaran paling sederhana: List vs Set
Bayangkan kita mempunyai data:
var list = ['Apple', 'Mango', 'Apple', 'Orange'];
var set = {'Apple', 'Mango', 'Apple', 'Orange'};
Hasilnya kira-kira:
List → [Apple, Mango, Apple, Orange]
Set → {Apple, Mango, Orange}
Kenapa?
Karena:
List→ boleh duplicateSet→ tidak boleh duplicate
Jadi kalau ingin mengingat perbedaan paling utama:
List cocok ketika urutan dan posisi/index penting. Set cocok ketika yang penting adalah data unik dan tidak ada duplicate.
2. Perbandingan pertama: urutan elemen
List
List adalah collection yang memiliki urutan.
var fruits = [
'mango',
'apple',
'orange',
];
Urutannya:
index 0 → mango
index 1 → apple
index 2 → orange
Urutan tersebut merupakan bagian penting dari cara kita menggunakan List.
Kalau kita tulis:
print(fruits[0]);
hasilnya:
mango
Set
Set tidak digunakan sebagai collection yang mengandalkan index.
var fruits = {
'mango',
'apple',
'orange',
};
Kita tidak seharusnya berpikir:
index 0 → mango
index 1 → apple
index 2 → orange
seperti pada List.
Memang, Set default Dart (LinkedHashSet) biasanya mempertahankan urutan ketika kita melakukan iterasi:
var fruits = {'mango', 'apple', 'orange'};
for (var fruit in fruits) {
print(fruit);
}
sering menghasilkan:
mango
apple
orange
Tetapi jangan menggunakan Set dengan asumsi bahwa setiap elemen mempunyai index yang bisa diakses seperti List.
Jadi:
| List | Set |
|---|---|
| Collection berurutan | Tidak berbasis index |
| Posisi elemen penting | Keunikan elemen lebih penting |
| Ada index | Tidak ada index langsung |
3. Duplicate element
Ini adalah salah satu perbedaan paling penting.
List boleh duplicate
var fruits = [
'apple',
'mango',
'apple',
'orange',
'apple',
];
Hasil:
[apple, mango, apple, orange, apple]
Tidak masalah ada apple tiga kali.
Set tidak boleh duplicate
var fruits = {
'apple',
'mango',
'apple',
'orange',
'apple',
};
Hasil:
{apple, mango, orange}
apple hanya disimpan satu kali.
Jadi ketika kita melakukan:
fruits.add('apple');
sementara apple sudah ada, Dart tidak menambahkan salinan kedua.
4. Mengakses elemen berdasarkan index
Ini perbedaan yang sangat penting.
Pada List
Kita bisa langsung menggunakan [].
var names = [
'John',
'Mark',
'Alex',
];
Ambil elemen pertama:
print(names[0]);
Hasil:
John
Ambil elemen kedua:
print(names[1]);
Hasil:
Mark
Pada Set
Kita tidak bisa:
var names = {'John', 'Mark', 'Alex'};
print(names[0]); // ❌
Ini tidak valid.
Kalau benar-benar ingin mengambil berdasarkan posisi iterasi, kita bisa menggunakan:
print(names.elementAt(0));
Tetapi ini bukan berarti Set memiliki index seperti List.
elementAt() hanya mengambil elemen berdasarkan urutan iterasi.
5. Memodifikasi elemen
List bisa mengubah elemen berdasarkan index
Misalnya:
var names = [
'John',
'Mark',
'Alex',
];
Kita bisa mengubah Mark menjadi James:
names[1] = 'James';
Hasil:
[John, James, Alex]
Set tidak bisa seperti itu
Tidak ada:
names[1] = 'James'; // ❌
Karena Set tidak mempunyai index assignment.
Kalau kita ingin mengubah data dalam Set, biasanya kita membuat hasil baru.
Misalnya:
var names = {'john', 'mark', 'alex'};
var upperNames = names
.map((name) => name.toUpperCase())
.toSet();
Hasil:
names → {john, mark, alex}
upperNames → {JOHN, MARK, ALEX}
Jadi bukan:
“Ubah elemen pada index tertentu.”
Melainkan:
“Buat Set baru berdasarkan transformasi terhadap data.”
6. Property length
Keduanya mempunyai:
.length
Contoh:
var list = ['A', 'B', 'C'];
var set = {'A', 'B', 'C'};
print(list.length); // 3
print(set.length); // 3
Sama-sama menghasilkan jumlah elemen.
Tetapi cara memperlakukannya berbeda.
List memiliki kemampuan mengubah length
Misalnya:
var numbers = [10, 20, 30];
numbers.length = 5;
List menjadi memiliki panjang 5.
Posisi yang belum mempunyai nilai akan diisi null jika tipe List mengizinkannya.
Sebaliknya:
numbers.length = 2;
akan memotong elemen sehingga tersisa dua elemen.
Set tidak seperti itu
Kita tidak melakukan:
set.length = 10; // ❌
length pada Set adalah hasil dari jumlah elemen yang ada.
Kalau ingin jumlah elemen berubah, kita harus menambah atau menghapus elemen:
set.add(40);
atau:
set.remove(20);
7. Sorting, reversing, dan shuffling
List
List menyediakan operasi yang berhubungan dengan posisi/urutan, misalnya:
sort()
shuffle()
reversed
Contoh:
var numbers = [30, 10, 20];
numbers.sort();
print(numbers);
Hasil:
[10, 20, 30]
Set
Set tidak memiliki API seperti List untuk memodifikasi dirinya menjadi hasil sort() atau shuffle().
Kalau kita ingin melakukan sorting terhadap isi Set, biasanya kita ubah dulu menjadi List.
var numbers = {30, 10, 20};
var sortedNumbers = numbers.toList()..sort();
print(sortedNumbers);
Hasil:
[10, 20, 30]
Jadi:
Set
↓
toList()
↓
List
↓
sort()
8. Mengubah List menjadi Map
Video juga membahas perbedaan ketika ingin mengubah collection menjadi Map.
Pada List, kita mempunyai index yang bisa dijadikan key.
Contoh:
var fruits = [
'mango',
'apple',
'orange',
];
Secara konsep:
0 → mango
1 → apple
2 → orange
Jadi index bisa digunakan sebagai key.
Misalnya kita ingin membuat Map:
var fruitMap = {
for (var i = 0; i < fruits.length; i++)
i: fruits[i]
};
Hasil:
{
0: mango,
1: apple,
2: orange
}
Kenapa Set tidak seperti itu?
Karena Set tidak mempunyai index.
Misalnya:
var fruits = {
'mango',
'apple',
'orange',
};
Tidak ada konsep resmi:
0 → mango
1 → apple
2 → orange
yang bisa kita gunakan seperti List.
Kalau ingin membuat Map dari Set, kita harus menentukan sendiri bagaimana key-nya.
9. null pada List dan Set
Ini juga menarik.
List dapat mempunyai banyak null
Contoh:
var values = [
null,
null,
null,
'hello',
];
Tidak masalah.
Bahkan null bisa muncul berkali-kali.
Set hanya dapat mempunyai satu null
Contoh:
var values = {
null,
null,
null,
'hello',
};
Hasilnya:
{null, hello}
Kenapa?
Karena null juga dianggap sebagai sebuah elemen.
Dan kita sudah tahu aturan Set:
Tidak boleh ada duplicate.
Jadi:
null
null
null
dianggap sebagai nilai yang sama, sehingga hanya satu yang disimpan.
10. Ringkasan 8 perbedaan
Sekarang kita satukan semuanya.
| Faktor | List | Set |
|---|---|---|
| 1. Urutan | Berurutan | Tidak berbasis index/posisi |
| 2. Duplicate | Boleh | Tidak boleh |
| 3. Akses index | Bisa list[0] | Tidak bisa set[0] |
| 4. Modifikasi berdasarkan index | Bisa | Tidak bisa |
5. length | Bisa diubah | Tidak bisa di-set langsung |
| 6. Sorting/shuffling | Didukung | Tidak secara langsung |
| 7. Key index untuk Map | Bisa | Tidak ada index |
8. null duplicate | Boleh banyak | Maksimal satu null |
11. Contoh supaya benar-benar kelihatan perbedaannya
Perhatikan dua collection ini:
var list = [
'Apple',
'Banana',
'Apple',
'Orange',
];
var set = {
'Apple',
'Banana',
'Apple',
'Orange',
};
List
[Apple, Banana, Apple, Orange]
Jumlah:
list.length
hasil:
4
Karena Apple dihitung dua kali.
Kita juga bisa:
print(list[2]);
Hasil:
Apple
Dan kita bisa mengubahnya:
list[2] = 'Mango';
Set
{Apple, Banana, Orange}
Jumlah:
set.length
hasil:
3
Karena Apple yang kedua tidak disimpan.
Kita tidak bisa:
set[2] = 'Mango'; // ❌
Kalau ingin mengubah isi, kita bisa melakukan operasi seperti:
set.remove('Apple');
set.add('Mango');
Sekarang:
{Banana, Orange, Mango}
12. Kapan sebaiknya menggunakan List?
Gunakan List kalau:
1. Urutan data penting
Misalnya daftar ranking:
1. Budi
2. Andi
3. Sinta
Posisi sangat penting.
2. Kamu membutuhkan index
Misalnya:
students[0]
students[1]
students[2]
List cocok.
3. Duplicate diperbolehkan
Misalnya daftar transaksi:
10000
10000
5000
10000
Tidak masalah ada nominal yang sama.
4. Kamu ingin sorting atau shuffle
Contohnya:
numbers.sort();
numbers.shuffle();
List lebih cocok.
13. Kapan sebaiknya menggunakan Set?
Gunakan Set kalau:
1. Data harus unik
Misalnya daftar tag:
flutter
dart
mobile
flutter
dart
Kita ingin:
flutter
dart
mobile
Gunakan Set.
2. Sering mengecek apakah data sudah ada
Misalnya:
if (registeredEmails.contains(email)) {
// sudah terdaftar
}
Set sangat cocok untuk konsep seperti ini.
3. Ingin melakukan operasi himpunan
Misalnya:
setA.union(setB);
setA.intersection(setB);
setA.difference(setB);
Ini sangat cocok dengan Set.
14. Cara mudah mengingat
Bayangkan dua benda.
List = daftar bernomor 📋
0 → Apple
1 → Banana
2 → Apple
3 → Orange
Ciri:
- ada posisi
- ada index
- duplicate boleh
- urutan penting
Set = kumpulan unik 🎒
Apple
Banana
Orange
Ciri:
- tidak ada duplicate
- tidak menggunakan index
- cocok untuk pengecekan keberadaan data
- cocok untuk operasi himpunan
15. Contoh kasus nyata di Flutter
Misalnya aplikasi kita mempunyai daftar kategori:
var categories = {
'Technology',
'Sports',
'Technology',
'News',
};
Kita tidak ingin Technology muncul dua kali.
Dengan Set:
{Technology, Sports, News}
Ini sangat masuk akal.
Tetapi misalnya kita membuat daftar chat:
var messages = [
'Hello',
'How are you?',
'Hello',
];
Kita tidak boleh sembarangan menggunakan Set, karena pesan "Hello" yang kedua mungkin memang merupakan pesan yang berbeda.
Dalam kasus seperti ini, List lebih cocok karena:
- urutan pesan penting
- duplicate boleh
- setiap pesan mempunyai posisi.
16. Kesimpulan paling penting
Jangan menganggap:
“
ListdanSetitu sama, cuma bentuk kurungnya berbeda.”
Memang keduanya sama-sama collection, tetapi tujuan penggunaannya berbeda.
List
Data → boleh duplicate
→ punya index
→ urutan penting
→ bisa akses list[0]
→ cocok untuk data yang memiliki posisi
Set
Data → harus unik
→ tidak punya index langsung
→ cocok untuk pengecekan membership
→ cocok untuk operasi himpunan
→ duplicate otomatis diabaikan
Kalau kamu bingung memilih, tanyakan dua pertanyaan ini:
“Apakah saya membutuhkan index/posisi?” → Ya → kemungkinan besar
List
“Apakah saya ingin memastikan tidak ada data duplicate?” → Ya → kemungkinan besar
Set
Dan satu koreksi penting terhadap video: jangan menyimpulkan bahwa Set di Dart selalu mengacak/tidak mempertahankan urutan. Set memang bukan indexed collection, tetapi implementasi default Dart (LinkedHashSet) biasanya mempertahankan urutan insertion saat diiterasi. Yang penting adalah jangan mengandalkan index seperti pada List.