- 1 1. Apa Itu Set?
- 2 2. Spesifikasi Dasar dan Manfaat Set
- 3 3. Kelas Implementasi Utama dan Karakteristiknya
- 4 4. Metode Umum dan Cara Menggunakannya
- 5 5. Common Use Cases and Typical Scenarios
- 6 6. Performance Considerations and Pitfalls
- 7 7. Diagram Perbandingan (Gambaran Umum)
- 8 8. Pertanyaan yang Sering Diajukan (FAQ)
- 9 9. Kesimpulan
1. Apa Itu Set?
Dalam pemrograman Java, Set adalah salah satu tipe koleksi yang paling penting. Kata “Set” berasal dari matematika, dan seperti set matematika, ia memiliki karakteristik utama bahwa tidak dapat berisi elemen duplikat.
Set digunakan ketika Anda ingin mengelola hanya nilai unik, terlepas dari apakah tipe data tersebut berupa angka, string, atau objek.
Apa Perbedaan Antara Set dan List?
Java Collections Framework menyediakan beberapa struktur data seperti List dan Map. Di antara mereka, Set dan List sering dibandingkan. Perbedaan utama mereka adalah sebagai berikut:
- List : Mengizinkan nilai duplikat dan mempertahankan urutan elemen (berbasis indeks).
- Set : Tidak mengizinkan duplikat, dan urutan elemen tidak dijamin (kecuali pada implementasi tertentu).
Singkatnya, List adalah “koleksi berurutan,” sementara Set adalah “koleksi elemen unik.”
Misalnya, jika Anda ingin mengelola ID pengguna tanpa duplikasi, Set adalah pilihan yang ideal.
Keuntungan Menggunakan Set
- Penghapusan duplikat otomatis Bahkan ketika menerima sejumlah besar data dari pengguna, cukup menambahkan elemen ke Set memastikan bahwa duplikat hanya disimpan sekali. Ini menghilangkan kebutuhan untuk memeriksa duplikat secara manual dan menyederhanakan implementasi.
- Pencarian dan penghapusan yang efisien Set dirancang untuk melakukan pemeriksaan keberadaan dan operasi penghapusan dengan cepat, meskipun kinerjanya bervariasi tergantung pada implementasinya (seperti HashSet atau TreeSet).
Kapan Harus Menggunakan Set?
- Ketika mengelola informasi yang tidak boleh diduplikasi, seperti alamat email atau ID pengguna
- Ketika keunikan data harus dijamin
- Ketika Anda ingin secara efisien membuat daftar nilai unik dari kumpulan data yang besar
Seperti yang ditunjukkan di atas, Set adalah mekanisme standar dalam Java untuk menangani koleksi yang tidak mengizinkan duplikat secara cerdas.
Pada bagian berikutnya, kami akan menjelajahi spesifikasi Set, pola penggunaan, dan contoh kode konkret secara detail.
2. Spesifikasi Dasar dan Manfaat Set
Di Java, Set didefinisikan oleh antarmuka java.util.Set. Dengan mengimplementasikan antarmuka ini, Anda dapat merepresentasikan koleksi elemen unik tanpa duplikat. Mari kita lihat lebih dekat spesifikasi inti dan keuntungan Set.
Karakteristik Dasar Antarmuka Set
Sebuah Set memiliki karakteristik berikut:
- Tidak ada elemen duplikat Jika Anda mencoba menambahkan elemen yang sudah ada, elemen tersebut tidak akan ditambahkan. Misalnya, bahkan jika Anda menjalankan
set.add("apple")dua kali, hanya satu “apple” yang akan disimpan. - Urutan tidak dijamin (tergantung implementasi) Set tidak menjamin urutan elemen secara default. Namun, beberapa implementasi seperti
LinkedHashSetdanTreeSetmengelola elemen dalam urutan tertentu. - Penanganan elemen null Apakah null diizinkan tergantung pada implementasinya. Misalnya,
HashSetmengizinkan satu elemen null, sementaraTreeSettidak.
Pentingnya equals dan hashCode
Apakah dua elemen dianggap duplikat dalam sebuah Set ditentukan oleh metode equals dan hashCode.
Saat menggunakan kelas kustom sebagai elemen Set, kegagalan untuk mengoverride metode‑metode ini dengan benar dapat menyebabkan duplikat yang tidak terduga atau perilaku penyimpanan yang salah.
equals: Menentukan apakah dua objek secara logis samahashCode: Mengembalikan nilai numerik yang digunakan untuk identifikasi yang efisien
Manfaat Menggunakan Set
Set menyediakan beberapa keuntungan praktis:
- Penghapusan duplikat yang mudah Cukup menambahkan nilai ke Set menjamin bahwa duplikat secara otomatis dihapus, menghilangkan kebutuhan untuk pemeriksaan manual.
- Pencarian dan penghapusan yang efisien Implementasi seperti
HashSetmenyediakan operasi pencarian dan penghapusan yang cepat, sering kali lebih unggul dibandingkan List. - API yang sederhana dan intuitif Metode dasar seperti
add,remove, dancontainsmembuat Set mudah digunakan.
Implementasi Internal dan Kinerja
One of the most common Set implementations, HashSet, internally uses a HashMap to manage elements. This allows element addition, removal, and lookup to be performed with average O(1) time complexity.
If ordering or sorting is required, you can choose implementations such as LinkedHashSet or TreeSet depending on your needs.
3. Kelas Implementasi Utama dan Karakteristiknya
Java menyediakan beberapa implementasi utama dari antarmuka Set. Masing‑masing memiliki karakteristik yang berbeda, sehingga memilih yang tepat untuk kasus penggunaan Anda sangat penting.
Di sini, kami akan menjelaskan tiga implementasi yang paling sering dipakai: HashSet, LinkedHashSet, dan TreeSet.
HashSet
HashSet adalah implementasi Set yang paling umum digunakan.
- Karakteristik
- Tidak mempertahankan urutan elemen (urutan penyisipan dan urutan iterasi dapat berbeda).
- Secara internal menggunakan
HashMap, memberikan operasi tambah, cari, dan hapus yang cepat. - Mengizinkan satu elemen
null. - Kasus Penggunaan Umum
- Ideal ketika Anda ingin menghilangkan duplikat dan urutan tidak penting.
- Contoh Kode
Set<String> set = new HashSet<>(); set.add("apple"); set.add("banana"); set.add("apple"); // Duplicate is ignored for (String s : set) { System.out.println(s); // Only "apple" and "banana" are printed }
LinkedHashSet
LinkedHashSet memperluas fungsionalitas HashSet dengan mempertahankan urutan penyisipan.
- Karakteristik
- Elemen diiterasi sesuai urutan mereka dimasukkan.
- Dikelola secara internal menggunakan kombinasi tabel hash dan linked list.
- Sedikit lebih lambat dibanding
HashSet, tetapi berguna ketika urutan penting. - Kasus Penggunaan Umum
- Terbaik ketika Anda ingin menghapus duplikat sambil mempertahankan urutan penyisipan.
- Contoh Kode
Set<String> set = new LinkedHashSet<>(); set.add("apple"); set.add("banana"); set.add("orange"); for (String s : set) { System.out.println(s); // Printed in order: apple, banana, orange }
TreeSet
TreeSet adalah implementasi Set yang secara otomatis mengurutkan elemen.
- Karakteristik
- Secara internal menggunakan Red‑Black Tree (struktur pohon seimbang).
- Elemen secara otomatis diurutkan dalam urutan naik.
- Pengurutan khusus dapat dilakukan menggunakan
ComparableatauComparator. - Nilai
nulltidak diizinkan. - Kasus Penggunaan Umum
- Berguna ketika Anda memerlukan keunikan sekaligus pengurutan otomatis.
- Contoh Kode
Set<Integer> set = new TreeSet<>(); set.add(30); set.add(10); set.add(20); for (Integer n : set) { System.out.println(n); // Printed in order: 10, 20, 30 }
Ringkasan
- HashSet : Terbaik untuk kinerja tinggi ketika urutan tidak diperlukan
- LinkedHashSet : Digunakan ketika urutan penyisipan penting
- TreeSet : Digunakan ketika pengurutan otomatis diperlukan
Memilih implementasi Set yang tepat tergantung pada kebutuhan spesifik Anda. Pilih yang paling sesuai dan gunakan secara efektif.
4. Metode Umum dan Cara Menggunakannya
Antarmuka Set menyediakan berbagai metode untuk operasi koleksi. Di bawah ini adalah metode yang paling sering dipakai, dijelaskan dengan contoh.
Metode Utama
add(E e)Menambahkan elemen ke Set. Jika elemen sudah ada, tidak akan ditambahkan.remove(Object o)Menghapus elemen yang ditentukan dari Set. Mengembalikan true jika berhasil.contains(Object o)Memeriksa apakah Set berisi elemen yang ditentukan.size()Mengembalikan jumlah elemen dalam Set.clear()Menghapus semua elemen dari Set.isEmpty()Memeriksa apakah Set kosong.iterator()Mengembalikan Iterator untuk menelusuri elemen‑elemen.toArray()Mengonversi Set menjadi array.
Contoh Penggunaan Dasar
Set<String> set = new HashSet<>();
// Add elements
set.add("apple");
set.add("banana");
set.add("apple"); // Duplicate ignored
// Get size
System.out.println(set.size()); // 2
// Check existence
System.out.println(set.contains("banana")); // true
// Hapus elemen
set.remove("banana");
System.out.println(set.contains("banana")); // false
// Hapus semua elemen
set.clear();
System.out.println(set.isEmpty()); // true
Iterating Over a Set
Since Set does not support index-based access (e.g., set.get(0)), use an Iterator or enhanced for-loop.
// Loop for yang ditingkatkan
Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("C");
for (String s : set) {
System.out.println(s);
}
// Menggunakan Iterator
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
}
Important Notes
- Adding an existing element using
adddoes not change the Set. - Element order depends on the implementation (HashSet: unordered, LinkedHashSet: insertion order, TreeSet: sorted).
5. Common Use Cases and Typical Scenarios
Java Sets are widely used in many situations where duplicate values must be avoided. Below are some of the most common and practical use cases encountered in real-world development.
Creating a Unique List (Duplicate Removal)
When you want to extract only unique values from a large dataset, Set is extremely useful.
For example, it can automatically remove duplicates from user input or existing collections.
Example: Creating a Set from a List to Remove Duplicates
List<String> list = Arrays.asList("apple", "banana", "apple", "orange");
Set<String> set = new HashSet<>(list);
System.out.println(set); // [apple, banana, orange]

Ensuring Input Uniqueness
Sets are ideal for scenarios where duplicate values must not be registered, such as user IDs or email addresses.
You can immediately determine whether a value already exists by checking the return value of add.
Set<String> emailSet = new HashSet<>();
boolean added = emailSet.add("user@example.com");
if (!added) {
System.out.println("Nilai ini sudah terdaftar");
}
Storing Custom Classes and Implementing equals/hashCode
When storing custom objects in a Set, proper implementation of equals and hashCode is essential.
Without them, objects with the same logical content may be treated as different elements.
Example: Ensuring Uniqueness in a Person Class
class Person {
String name;
Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
// Contoh penggunaan
Set<Person> people = new HashSet<>();
people.add(new Person("Taro"));
people.add(new Person("Taro")); // Tanpa implementasi yang tepat, duplikat dapat terjadi
System.out.println(people.size()); // 1
Fast Lookup and Data Filtering
Because Set provides fast lookups via contains, it is often used for filtering and comparison tasks.
Converting a List to a Set can significantly improve performance when repeatedly checking for existence.
Example: Fast Keyword Lookup
Set<String> keywordSet = new HashSet<>(Arrays.asList("java", "python", "c"));
boolean found = keywordSet.contains("python"); // true
6. Performance Considerations and Pitfalls
While Set is a powerful collection for managing unique elements, improper usage can lead to unexpected behavior or performance issues. This section explains key performance characteristics and common pitfalls.
Performance Differences by Implementation
- HashSet Menggunakan tabel hash secara internal, memberikan kinerja rata-rata O(1) untuk operasi tambah, hapus, dan pencarian. Kinerja dapat menurun jika jumlah elemen menjadi sangat besar atau jika tabrakan hash sering terjadi.
- LinkedHashSet Kinerja serupa dengan HashSet, tetapi dengan overhead tambahan karena mempertahankan urutan penyisipan. Dalam kebanyakan kasus, perbedaannya dapat diabaikan kecuali menangani dataset yang sangat besar.
- TreeSet Menggunakan Red-Black Tree secara internal, menghasilkan kinerja O(log n) untuk operasi tambah, hapus, dan pencarian. Lebih lambat dibandingkan HashSet, tetapi menyediakan pengurutan otomatis.
Menggunakan Objek Mutable sebagai Elemen Set
Perlu kehati-hatian ekstra saat menyimpan objek mutable dalam sebuah Set.
HashSet dan TreeSet bergantung pada nilai hashCode atau compareTo untuk mengelola elemen.
Jika nilai-nilai ini berubah setelah penyisipan, pencarian dan penghapusan dapat gagal.
Contoh: Jebakan dengan Objek Mutable
Set<Person> people = new HashSet<>();
Person p = new Person("Taro");
people.add(p);
p.name = "Jiro"; // Modifying after insertion
people.contains(p); // May return false unexpectedly
Untuk menghindari masalah tersebut, sangat disarankan untuk menggunakan objek immutable sebagai elemen Set bila memungkinkan.
Menangani Nilai null
- HashSet / LinkedHashSet : Mengizinkan satu elemen null
- TreeSet : Tidak mengizinkan null (melempar NullPointerException)
Catatan Penting Lainnya
- Modifikasi selama iterasi Memodifikasi Set saat sedang diiterasi dapat menyebabkan
ConcurrentModificationException. GunakanIterator.remove()alih-alih memodifikasi Set secara langsung. - Memilih implementasi yang tepat Gunakan
LinkedHashSetatauTreeSetketika urutan penting.HashSettidak menjamin urutan.
7. Diagram Perbandingan (Gambaran Umum)
Tabel di bawah merangkum perbedaan antara implementasi Set utama untuk perbandingan yang mudah.
| Implementation | No Duplicates | Order Preserved | Sorted | Performance | null Allowed | Typical Use Case |
|---|---|---|---|---|---|---|
| HashSet | Yes | No | No | Fast (O(1)) | One allowed | Duplicate removal, order not required |
| LinkedHashSet | Yes | Yes (Insertion order) | No | Slightly slower than HashSet | One allowed | Duplicate removal with order preservation |
| TreeSet | Yes | No | Yes (Automatic) | O(log n) | Not allowed | Duplicate removal with sorting |
Poin Penting
- HashSet : Pilihan default ketika urutan tidak relevan dan kinerja penting.
- LinkedHashSet : Terbaik ketika urutan penyisipan harus dipertahankan.
- TreeSet : Ideal ketika pengurutan otomatis diperlukan.
8. Pertanyaan yang Sering Diajukan (FAQ)
Q1. Dapatkah tipe primitif (int, char, dll.) digunakan dalam Set?
A1. Tidak. Gunakan kelas pembungkus seperti Integer atau Character sebagai gantinya.
Q2. Apa yang terjadi jika nilai yang sama ditambahkan berkali-kali?
A2. Hanya penyisipan pertama yang disimpan. Metode add mengembalikan false jika elemen sudah ada.
Q3. Kapan saya harus menggunakan List vs Set?
A3. Gunakan List ketika urutan atau duplikat penting, dan Set ketika keunikan diperlukan.
Q4. Apa yang diperlukan untuk menyimpan objek kustom dalam Set?
A4. Override equals dan hashCode dengan benar.
Q5. Bagaimana saya dapat mempertahankan urutan penyisipan?
A5. Gunakan LinkedHashSet.
Q6. Bagaimana saya dapat mengurutkan elemen secara otomatis?
A6. Gunakan TreeSet.
Q7. Apakah Set dapat berisi nilai null?
A7. HashSet dan LinkedHashSet mengizinkan satu null; TreeSet tidak.
Q8. Bagaimana cara mendapatkan ukuran Set?
A8. Gunakan size().
Q9. Bagaimana saya dapat mengonversi Set menjadi List atau array?
A9.
- Menjadi array:
toArray() - Menjadi List:
new ArrayList<>(set)
Q10. Dapatkah saya menghapus elemen saat iterasi?
A10. Ya, tetapi hanya dengan menggunakan Iterator.remove().
9. Kesimpulan
Artikel ini membahas koleksi Set Java dari dasar hingga penggunaan lanjutan. Poin-poin utama meliputi:
- Set dirancang untuk mengelola koleksi elemen unik, menjadikannya ideal untuk menghilangkan duplikat.
- Implementasi utama meliputi HashSet (cepat, tidak berurutan), LinkedHashSet (urutan penyisipan), dan TreeSet (terurut).
- Kasus penggunaan umum termasuk penghapusan duplikat, pemeriksaan keunikan, pengelolaan objek kustom, dan pencarian cepat.
- Memahami karakteristik kinerja dan jebakan seperti objek mutable serta aturan iterasi sangat penting.
- Tabel perbandingan dan FAQ memberikan panduan praktis untuk pengembangan dunia nyata.
Menguasai koleksi Set membuat pemrograman Java lebih bersih, lebih aman, dan lebih efisien.
Selanjutnya, pertimbangkan menggabungkan Set dengan List atau Map untuk membangun struktur data dan solusi yang lebih maju.

