Selasa, 27 Desember 2011

SET

Set adalah collection yang bersifat unik, arti unik adalah dengan mengoverride method equals dah hashCode dari class yang akan dimasukkan dalam Set. Semua class wrapper seperti String telah mengoverride method equals dan hashCode, sehingga dua buah object dianggap sama jika string didalamnya sama. Untuk class yang dibuat sendiri seperti class Customer maka method equals dan hashCode harus di override dahulu sebelum dimasukkan kedalam Set, kalau tidak dioverride maka kedua object dianggap sama jika mempunya reference ke object yang sama ( tidak sesuai harapan ).

Class implementasi dari interface Set yang paling sering digunakan adalah HashSet. Nilai kembalian dari method hashCode sangat penting dalam class HashSet karena digunakan untuk menentukan dimana object tersebut diletakkan pada HashSet. Ketika method add dipanggil dengan parameter object, HashSet akan memanggil method hashCode dari object tersebut untuk menentukan di keranjang mana object tersebut akan diletakkan. Setelah menemukan nomor keranjangnya maka dicek apakah keranjang tersebut kosong atau tidak. Kalau kosong maka object akan langsung diletakkan pada keranjang tersebut. Kalau keranjang ada isinya maka dilakukan pengetesan dengan method equals, kalau ada object dalam keranjangan dilakukan pengetesan dengan method equals menghasilkan true, maka object lama akan ditimpa dengan object baru.

Kecepatan pencarian pada HashSet tergantung dari perhitungan hashCode, Kalau method hashCode selalu return 1 maka object dalam keranjang HashSet akan diletakkan pada keranjang yang sama sehingga pencarian menjadi linier karena akan dibandingkan isinya dengan method equals satu per satu. Kalau setiap object memiliki hashCode yang unik maka pencarian akan cepat.

Kalau nilai hashCode tidak selalu unik. HashSet akan melihat isi dalam keranjang, kalau ada satu object maka object tersebut merupakan kembalian pencarian, kalau tidak ada object maka kembaliannya null, kalau ada beberapa object maka akan ditest menggunakan method equals, ketika method equals menghasilkan true maka object tersebut adalah hasil pencarian.

Jika dua buah object dipanggil method equals menghasilkan nilai true tetapi hashCodenya berbeda (menyalahi aturan), maka hashSet kedua object ini dianggap berbeda karena diletakkan pada keranjang yang berbeda karenak keranjangnya berbeda maka method equals akan diabaikan, tidak pernah dipanggil. Jadi harus ditaati kalau dua object dioperasikan dengan method equals menghasilkan kembalikan true, maka hashCodenya harus berbeda.


Keranjang           1         2         3
                           "a"      "b"      "ab"
                                                 "ba"

Algoritma sederhana menghitung hashCode dari class String adalah dengan menambahkan urutan dari huruf misal, String "a" nilai hashCodenya 1, String "b" nilai hashCodenya 2, String "ab" dan "ba" nilai hashCodenya 3, string "ab" dan "ba" diletakkan pada keranjang yang sama karena nilai hashCodenya sama tetapi tidak ditimpa karena "ab".equals("ba") menghasilkan false.

import java.util.*;
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 id 1 karena no idnya sama
                         Iterator<Customer> i = customers.iterator();
                         while(i.hasNext()){
                                   Customer current = i.next();
                                   System.out.println("Keranjang no- " + current.hashCode() + " idnya : " + current.getId() );
                         }
              }
}

Keranjang no- 373 idnya : 2
Keranjang no- 372 idnya : 1

no keranjang tidak berurut dari kecil ke besar, HashSet hanya menekankan pada sifat yang unik saja, sedangkan urutan dan keteraturan tidak dijamin.

Tidak ada komentar:

Posting Komentar