Kepada pengunjung Yang Terhormat

Saya harap anda bahagia dengan postingan di Blog ini. anda senang,saya Melayang

Sunday, 24 January 2021

Set pada pemrograman Java 7d8as7da6

 

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

iklan popcash