Set pada pemrograman
Java 7d8as7da6
Set adalah collection yang bersifat unik. Set digunakan
kalau anda memerlukan collection yang isinya
harus unik. Defnisi
unik diimplementasikan dengan
mengoverride method equals
dan hashCode dari class yang akan dimasukkan ke dalam Set. Semua class
wrapper seperti String telah mengoverride method equals dan hashCode sehingga
dua buah object String dianggap sama kalau
string yang ada
di dalamnya sama.
Untuk class yang
kita buat sendiri,
seperti class Customer, maka
method equals dan hashCode harus dioverride dahulu sebelum dimasukkan ke
dalam Set. Kalau
method equals dan
hashCode tidak dioverride
maka dua buah
object dianggap sama kalau keduanya merefer ke object yang sama di dalam
memory, tidak seperti yang kita harapkan. Class implementasi dari interface Set
yang paling sering digunakan adalah HashSet. Nilai yang dikembalikan oleh
hashCode sangat penting dalam class HashSet. Nilai hashCode digunakan
untuk menentukan di mana
object tersebut diletakkan
dalam “keranjang” HashSet. Ketika method add di panggil dengan parameter
object, HashSet akan memaggil method hashCode dari object tersebut untuk
menentukan di keranjang mana object akan diletakkan. Setelah ketemu nomer
keranjangnya, dicek apakah keranjang tersebut kosong. Kalau kosong maka
object langsung diletakkkan
di keranjang tersebut.
Kalau keranjang ada
isinya, dilakukan pengetesan menggunakan
method equals, kalau
ada object di
dalam keranjang ditest menggunakan method
equals menghasilkan true,
maka object lama
akan ditimpa dengan object baru yang dimasukkan ke dalam
HashSet menggunakan method add tadi.
Kecepatan proses pencarian
object di dalam
HashSet tergantung dari
bagaimana kita melalukan
perhitungan hashCode. Kalau misalnya kita selalu return nilai 1 untuk semua
object, maka semua object
akan diletakkan dalam
satu keranjang yang
sama, proses pencarian menjadi linier (O(n)) karena object
akan dibandingkan satu per satu menggunakan method equals. Kalau hashCode
bersifat unik untuk setiap object, maka proses pencarianya sangat cepat yaitu
O(1), HashSet akan memanggil method hashCode untuk mendapatkan nilainya. Kalau nilai hashCode tidak selalu unik, HashSet akan melihat di dalam keranjang
tersebut adakah object di dalamnya, kalau ada satu buah maka object itu akan
dikembalikan sebagai hasil pencarian,
kalau kosong yang dikembalikan adalah null, kalau ada beberapa buah maka untuk
setiap object di dalam keranjang ditest menggunakan method equals, ketika
method equals mengembalikan true maka object tersebut adalah hasil
pencarianya. Jika dua buah object dipanggil
method equals menghasilkan nilai
true tetapi hashCodenya berbeda
(menyalahi aturan), maka oleh HashSet kedua object ini dianggap berbeda karena
akan diletakkan di dalam keranjang yang berbeda, asal keranjangnya berbeda maka
method equals akan diabaikan, tidak pernah dipanggil. Jadi harus ditaati aturan
bahwa kalau dua buah object
dioperasikan dengan method
equals mengembalikan true,
nilai hashCodenya harus sama.
Perhatikan visualisasi HashSet yang berisi String di bawah
ini :
Set pada pemrograman
Java 7d8as7da6
Set adalah collection yang bersifat unik. Set digunakan
kalau anda memerlukan collection yang isinya
harus unik. Defnisi
unik diimplementasikan dengan
mengoverride method equals
dan hashCode dari class yang akan dimasukkan ke dalam Set. Semua class
wrapper seperti String telah mengoverride method equals dan hashCode sehingga
dua buah object String dianggap sama kalau
string yang ada
di dalamnya sama.
Untuk class yang
kita buat sendiri,
seperti class Customer, maka
method equals dan hashCode harus dioverride dahulu sebelum dimasukkan ke
dalam Set. Kalau
method equals dan
hashCode tidak dioverride
maka dua buah
object dianggap sama kalau keduanya merefer ke object yang sama di dalam
memory, tidak seperti yang kita harapkan. Class implementasi dari interface Set
yang paling sering digunakan adalah HashSet. Nilai yang dikembalikan oleh
hashCode sangat penting dalam class HashSet. Nilai hashCode digunakan
untuk menentukan di mana
object tersebut diletakkan
dalam “keranjang” HashSet. Ketika method add di panggil dengan parameter
object, HashSet akan memaggil method hashCode dari object tersebut untuk
menentukan di keranjang mana object akan diletakkan. Setelah ketemu nomer
keranjangnya, dicek apakah keranjang tersebut kosong. Kalau kosong maka
object langsung diletakkkan
di keranjang tersebut.
Kalau keranjang ada
isinya, dilakukan pengetesan menggunakan
method equals, kalau
ada object di
dalam keranjang ditest menggunakan method
equals menghasilkan true,
maka object lama
akan ditimpa dengan object baru yang dimasukkan ke dalam
HashSet menggunakan method add tadi.
Kecepatan proses pencarian
object di dalam
HashSet tergantung dari
bagaimana kita melalukan
perhitungan hashCode. Kalau misalnya kita selalu return nilai 1 untuk semua
object, maka semua object
akan diletakkan dalam
satu keranjang yang
sama, proses pencarian menjadi linier (O(n)) karena object
akan dibandingkan satu per satu menggunakan method equals. Kalau hashCode
bersifat unik untuk setiap object, maka proses pencarianya sangat cepat yaitu
O(1), HashSet akan memanggil method hashCode untuk mendapatkan nilainya. Kalau nilai hashCode tidak selalu unik, HashSet akan melihat di dalam keranjang
tersebut adakah object di dalamnya, kalau ada satu buah maka object itu akan
dikembalikan sebagai hasil pencarian,
kalau kosong yang dikembalikan adalah null, kalau ada beberapa buah maka untuk
setiap object di dalam keranjang ditest menggunakan method equals, ketika
method equals mengembalikan true maka object tersebut adalah hasil
pencarianya. Jika dua buah object dipanggil
method equals menghasilkan nilai
true tetapi hashCodenya berbeda
(menyalahi aturan), maka oleh HashSet kedua object ini dianggap berbeda karena
akan diletakkan di dalam keranjang yang berbeda, asal keranjangnya berbeda maka
method equals akan diabaikan, tidak pernah dipanggil. Jadi harus ditaati aturan
bahwa kalau dua buah object
dioperasikan dengan method
equals mengembalikan true,
nilai hashCodenya harus sama.
Perhatikan visualisasi HashSet yang berisi String di bawah
ini :
Algoritma
sederhana untuk menghitung
hashCode dari class
String adalah menambahkan
urutan dari hurufnya,
misalnya string “a”
nilai hashCodenya 1,
“b” nilai hashCodenya
2, sedangkan string “ab” dan “ba” nilai hashCodenya sama yaitu 3. Bisa
kita lihat juga string “ab” dan “ba” diletakkan dalam keranjang yang sama
karena hashCodenya sama, tetapi tidak saling timpa, hal ini karena
“ab”.equals(“ba”) bernilai false. Tujuh
paragraf menerangkan tentang Set kok rasanya masih kurang kalau kalau belum
melihat kode bagaimana menggunakan Set ini. Kita akan menggunakan class
Customer yang sudah dioverride method equals dan hashCodenya di bab sebelumnya,
perhatikan juga bahwa equals dan hashCode dari class Customer di atas ,
kemudian buat class di bawah ini di folder yang
sama dengan class Customer :
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
public class CustomerSetTest{
public static void
main(String[] args) {
Set<Customer> customers = new HashSet<Customer>();
Customer id1 = new
Customer();
id1.setId(1l);
customers.add(id1);
Customer id2 = new
Customer();
id2.setId(2l);
customers.add(id2);
Customer c = new
Customer();
c.setId(1l);
customers.add(c);
//mereplace id1 karena mempunyai id yang sama
Iterator<Customer> i = customers.getIterator();
while(i.hasNext()){
Customer
current = i.next();
System.out.println("keranjang no-" + current.hashCode()
+ "
idnya:" + current.getId());
}
}
}
Perhatikan juga kode di atas menggunakan Iterator untuk
mengambil nilai dalam Set satu per satu, ada bentuk for each yang diperkenalkan
sebagai bagian dari Java 5 Language enhancement, bentuk for each ini
menyederhanakan kode untuk mengakses item di dalam Set. For each akan kita
bahas di bab tentang java 5 languge enhancement. Hasil eksekusi kode di atas adalah
seperti
di bawah ini :
$ javac Customer.java CustomerSetTest.java Customer.java
$ java CustomerSetTest
keranjang no-373 idnya:2
keranjang no-372 idnya:1
$
Anda mungkin juga terkejut, ternyata nomor keranjangnya pun
tidak terurut dari kecil ke besar. HashSet adalah collection yang hanya
menekankan pada sifat unik saja, sedangkan urutan dan keteraturan tidak dijamin
sama sekali. Ada jenis collection lain yang bisa menjamin sifat unik sekaligus
terurut, yaitu TreeSet, kita akan membahas tentang TreeSet nanti di bab setelah
kita bahas konsep sorting.