Kamis, 22 Desember 2011

EQUALS DAN HASHCODE

method equals dan hashcode berperan sangat penting dalam collection. Method equals digunakan untuk membandingkan dua buah object apakan sama atau tidak secara logis. Operator == dapat digunakan untuk membandingkan dua buah  object, tetapi perbandingan ini hanya menghasilkan nilai yang true kalau dua buah object apakah berada dalam memory yang sama, atau bisa dibilang dua buah object mempunyai reference yang sama persis, baik secara alamat memory dan otomatis sama secara logis.

Method equals akan mengembalikan nilai true kalau kedua object sama secara logis walaupun kedua object mempunyai reference yang berbeda (tidak berada di memory yang sama). Contoh String, dua buah object string akan menghasilkan false jika dioperasiakan dengan == walaupun string didalamnya sama. Tetapi method equals akan menghasilkan nilai true walaupun objectnya berada didalam memory yang berbeda asalkan nilai stringnya sama.

public class EqualsTest{
            public static void main(String[] args){
                         String abc = new String("abc");
                         String abc1 = new String("abc");
                         boolean equalsOperator = (abc == abc1);
                         System.out.println("abc == abc ? " + equalsOperator);
                         boolean equalsMethod = abc.equals(abc1);
                         System.out.println("abc.equals(abc) ? " + equalsMethod);
             }
}

abc == abc ? false
abc.equals(abc) ? true

Jika kita ingin membandingkan dua buah object apakah sama secara logis, kita akan menggunakan method equals, tetapi masalahnya implementasi method equals dari class Object sama persis dengan menggunakan operator ==, sehingga harus di override agar walau dua buah object yang berbeda tetap dianggap sama asalkan suatu kriteria terpenuhi.

Misalkan class Customer, dua buah object customer dianggap sama asalkan idnya sama, oleh karena itu method equals dioverride

public class Customer{
           private Long id;
           public void setId (Long aId){
                      this.id = aid;
           }
           public Long getId (){
                      return this.id;
           }
           public boolean equals(Object obj){
                      if(obj == null){
                                   return false;
                      }
                      if(getClass() != obj.getClass()){
                                    return false;
                      }
                      final Customer other = (Customer) obj;
                      if(this.id != other.id && (this.id != null || !this.id.equals(other.id))){
                                    return false;
                      }
                      return true;
           }
}

method hashCode akan mengembalikan nilai integer yang unik untuk setiap object yang berbeda 

method hashCode dari sebuah object harus mengembalikan nilai yang sama walaupun dieksekusi berkali kali selama nilai property didalamnya tidak berubah.
Kalau dua buah object dioperasikan dengan method equals mengembalikan nilai true maka method hashCode dari kedua object harus mengembalikan nilai integer yang sama. Sebaliknya kalau dua buah object mengembalikan nilai false maka hashCode untuk kedua object akan mengembalikan nilai integer yang berbeda.
Kalau dua buah object dioperasikan dengan method equals mengembalikan nilai false maka hashCode kedua object tidak harus mengembalikan nilai interger yang berbeda, sama pun tidak masalah.

method hashCode akan digenerate dengan sendirinya oleh IDE seperti netbeans, eclipse, dll

public class Customer{
            private Long id;
            public void setId(Long aId){
                      this.id = aId;
           }
           public Long getId(){
                        return id;
           }
           public boolean equals(Object obj){
                      if(obj == null){
                               return false;
                      }
                      if(getClass() != obj.getClass()){
                               return false;
                      }
                      final Customer other = (Customer) obj;
                      if(this.id != other.id && (this.id != null || !this.id.equals(other.id))){
                               return false;
                     }

           }
           public int hashCode() {
                    int hash = 7;
                    hash = 53 * hash + (this.id != null ? this.id.hashCode() : 0);
                    return hash;
           }

}

HashCode sangat vital ketika menggunakan collection yang memanfaatkan nilai hashCode, seperti HashSet HashMap. Perhitungan hashCode yang salah akan mengakibatkan kedua jenis collection ini berantakan.

2 komentar:

  1. mengapa nilai hash (int) 7 ?
    mengapa dikalikan 53 ?
    aahhh masih banyak yg belum aku pahami
    tolong jawab

    BalasHapus
    Balasan
    1. angka 7 dan 53 untuk gnerate hash code, boleh diganti angka berapa saja. namun disarankan menggunakan bilangan prima. 53 dan 7 adalah bilangan prima.

      Hapus