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.
No comments:
Post a Comment