equal dan hashcode

186 views
Skip to first unread message

odeng

unread,
Mar 1, 2011, 2:12:34 AM3/1/11
to Java User Group Bandung
selamt siang temen2, sebenarnya fungsi untama equal dan hascode apa
sich, pada sebuah class entity biasanya. kalo yang saya ketahui,
fungsi tersebut intinya agar ketika object yang telah diinstan tidak
sama. apakah benar seperti itu? tetapi ketika saya men-develop
aplikasi, dan pada aplikasi tersbut saya kasih dua method tersebut
atau tidak saya kasih kok gak errror. truz fungsi yang sangat real apa
conk???
terimas kasih sebelumnya.

Muhammad Ghazali

unread,
Mar 1, 2011, 3:43:19 AM3/1/11
to jug-b...@googlegroups.com

2011/3/1 odeng <lepen...@yahoo.co.id>

Sesuai dengan dokumentasi dari method tersebut
method equal berfungsi:
"Indicates whether some other object is "equal to" this one."
http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#equals(java.lang.Object)

dan metdhod hashcode berfungsi:
"Returns a hash code value for the object"


--
Blog: http://muhammadghazali.web.id/blog
GTalk: muhammadghazali2480
Skype: muhammadghazali2480
Twitter: http://twitter.com/muhghazali
JUG-bandung: http://groups.google.com/group/jug-bandung
My FB Fan Pages: http://bit.ly/MuhammadGhanozGhazaliFanPages

dendy way

unread,
Mar 1, 2011, 3:45:40 AM3/1/11
to jug-b...@googlegroups.com


2011/3/1 odeng <lepen...@yahoo.co.id>

baca donk java-documentation-nya.

odeng

unread,
Mar 1, 2011, 2:44:24 AM3/1/11
to Java User Group Bandung

Ifnu bima

unread,
Mar 1, 2011, 9:26:52 PM3/1/11
to jug-b...@googlegroups.com, odeng
Ini jawabanya saya copy paste dari buku Java Desktop saya yang akan
segera release ;)

equals dan hashcode

Method equals dan hashCode berperan sangat penting dalam collection.
Method equals
digunakan untuk membandingkan antara dua buah object apakah sama atau
tidak secara logis.
Operator == bisa digunakan untuk membandingkan dua buah object, tetapi
perbandingan ini
hanya akan menghasilkan true kalau dua buah object apakah berada dalam
memory yang sama,
atau bisa dikatakan dua buah object ini mempunyai reference yang sama
persis. Kalau operator
== mengembalikan nilai true berarti dua buah object ini adalah sama
persis baik secara alamat
memory dan otomatis sama secara logis.

Method equals akan mengembalikan true kalau kedua object sama secara
logis walaupun kedua
object mempunyai reference berbeda (tidak berada di memory yang sama).
Kita ambil contoh
sebuah String, dua buah object string akan mengembalikan false jika
dioperasikan dengan
operator == walaupun string yang ada di dalamnya sama. Tetapi method equals akan
mengembalikan nilai true walaupun objectnya berada di memory berbeda
asalkan nilai stringnya
sama.

Mari kita lihat bagaimana penjelasan di atas kalau dilihat dalam kode.
Perhatikan kode berikut
ini :

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);
}
}

apakah output dari kode diatas? Menggunakan operator == maka hasilnya
adalah false karena
kedua variabel String diinisialisasi dengan menggunakan new String.
Sedangkan menggunakan
method equals hasilnya adalah true karena kedua variabel mempunyai
nilai string yang sama.

$ javac EqualsTest.java
$ java EqualsTest
abc == abc ? false
abc.equals(abc) ? true
$

Kalau ingin membandingkan dua buah object apakah sama secara logis,
kita akan menggunakan
method equals, tetapi masalahnya adalah implementasi method equals
dari class Object sama
persis dengan operator ==, sehingga harus dioverride agar walaupun dua
buah object yang
berbeda tetap dianggap sama asalkan suatu kriteria terpenuhi. Seperti
yang terjadi dengan
class String dalam contoh diatas, method equalsnya dioverride agar
mengembalikan true kalau
dua buah object dari class String mempunyai nilai string yang sama.
Misalnya untuk class Customer, dua buah object Customer dianggap sama
asalkan idnya sama,
oleh karena itu method equals akan dioverride seperti di bawah ini :

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;
}
}

Terlihat mengoverride method equals bukan pekerjaan yang gampang,
cukup banyak kode
yang harus diketik, nantinya menggunakan NetBeans proses pembuatan
method equals bisa
digenerate secara otomatis, sehingga meminimalisasi kode yang harus
diketik manual.
Method hashCode akan mengembalikan nilai integer unik untuk setiap
object yang berbeda.
Aturanya adalah :
• Method hashCode dari sebuah object harus mengembalikan nilai yang
sama walaupun
dieksekusi berkali kali selama nilai property dalam object 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 method hashCode tidak harus mengembalikan nilai yang berbeda. Mengembalikan
nilai yang sama pun tidak masalah.

Topik bagaimana menghitung nilai hashCode yang baik bisa menjadi topik
PhD, tetapi tidak
perlu bingung, menggunakan NetBeans kita bisa mengenerate method
hashCode ini agar
mematuhi aturan di atas. Class Customer menggunakan property id
sebagai nilai unik, asal
nilai idnya berbeda maka dianggap dua buah object Customer yang
berbeda, oleh karena itu
nilai hashCode akan dihitung dari id ini. Nah, kode lengkap class
Customer setelah method
hashCode dioverride adalah seperti di bawah ini :

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;
}
public int hashCode() {
int hash = 7;
hash = 53 * hash + (this.id != null ? this.id.hashCode() : 0);
return hash;
}
}

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

--
http://ifnubima.org/indo-java-podcast/
@ifnubima

regards

odeng

unread,
Mar 2, 2011, 9:45:29 PM3/2/11
to Java User Group Bandung
temen2 terima kasih banyak!
mas ifnu, thumb's!!! :)

aldi ....

unread,
Mar 2, 2011, 11:22:11 PM3/2/11
to Java User Group Bandung


On Mar 2, 9:26 am, Ifnu bima <ifnub...@gmail.com> wrote:
Pesan bukunya dong mas Ifnu :) sorry..OOT

Hida Logic

unread,
Mar 4, 2011, 6:25:07 AM3/4/11
to jug-b...@googlegroups.com
mas ifnu bukunya mau diterbitkan dmn neh... ane pesen yah...

Jogi Silalahi

unread,
Mar 4, 2011, 6:35:15 AM3/4/11
to jug-b...@googlegroups.com
wah, mas Ifnu bima kasih bocoran bukunya nih.
kabari ya mas kalau udah diterbitkan :)

On 3/4/11, Hida Logic <hida....@gmail.com> wrote:
> mas ifnu bukunya mau diterbitkan dmn neh... ane pesen yah...
>


--
Jogi Henra Ersa Silalahi
Chief Communication Officer
http://www.triplelands.com
http://www.about.me/jogisilalahi

Reply all
Reply to author
Forward
0 new messages