"Saiki aku bakal pitutur marang kowe bab sawetara cara sing mung mbiyantu:  padha (Obyek o) & hashCode () ."

"Sampeyan mbokmenawa wis ngelingi yen, ing Jawa, nalika mbandhingake variabel referensi obyek dhewe ora dibandhingake, nanging referensi kanggo obyek."

Kode Panjelasan
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i==j);
i ora padha karo j
Variabel nuding obyek sing beda.
Sanajan obyek kasebut ngemot data sing padha.
Integer i = new Integer(1);
Integer j = i;
System.out.println(i==j);
aku padha j. Variabel kasebut ngemot referensi kanggo obyek sing padha.

"Iya, aku inget."

Sing  padha .

"Cara sing padha yaiku solusi standar ing kene. Tujuan saka metode sing padha yaiku kanggo nemtokake manawa obyek kasebut identik sacara internal kanthi mbandhingake apa sing disimpen ing njero."

"Lan kepiye carane?"

"Kabeh meh padha karo metode toString ()."

Kelas Obyek duwe implementasine metode sing padha, sing mung mbandhingake referensi:

public boolean equals(Object obj)
{
return (this == obj);
}

"Apik ... bali maneh, ta?"

"Tetep dagumu! Iki pancen angel banget."

"Cara iki digawe kanggo ngidini pangembang nimpa ing kelas dhewe. Sawise kabeh, mung pangembang kelas sing ngerti data apa sing relevan lan apa sing ora nalika mbandhingake."

"Apa sampeyan bisa menehi conto?"

"Tentu. Upaminipun kita duwe kelas sing makili pecahan matematika. Iku bakal katon kaya iki: "

Tuladha:
class Fraction
{
private int numerator;
private int denominator;
Fraction(int numerator, int denominator)
{
this.numerator  = numerator;
this.denominator = denominator;
}public boolean equals(Object obj)
{
if (obj==null)
return false;

if (obj.getClass() != this.getClass() )
return false;

Fraction other = (Fraction) obj;
return this.numerator* other.denominator == this.denominator * other.numerator;
}
}
Tuladha cara nelpon:
Fraction one = new Fraction(2,3);
Fraction two = new Fraction(4,6);
System.out.println(one.equals(two));
Panggilan metode bakal bali bener.
Pecahan 2/3 padha karo pecahan 4/6

"Saiki, ayo mbedah conto iki."

"We overrode cara padha , supaya obyek Fraksi bakal duwe implementasine dhewe.

"Ana sawetara pamriksan ing metode kasebut:"

" 1)  Yen obyek liwati kanggo comparison punika null , banjur obyek ora padha. Yen sampeyan bisa nelpon cara witjaksono ing obyek, iku mesthi ora null .

" 2)  A comparison kelas. Yen obyek iku kedadean saka kelas beda, banjur kita ora bakal nyoba kanggo mbandhingaké mau. Nanging, kita bakal langsung nggunakake bali palsu kanggo nunjukaké sing iki obyek beda."

" 3)  Kabeh padha ngelingi saka kelas loro yen 2/3 padha karo 4/6. Nanging carane mriksa sing?"

2/3 == 4/6
Kita multiply loro-lorone dening loro divisors (6 lan 3), lan kita njaluk:
6 * 2 == 4 * 3
12 == 12
Aturan umum:
Yen
a / b == c / d
Banjur
a * d == c * b

"Mangkono, ing bagean katelu saka cara witjaksono , kita sijine obyek liwati menyang Fraksi lan mbandhingaké pecahan."

"Get, yen kita mbandhingake numerator karo numerator lan denominator karo denominator, banjur 2/3 ora padha karo 4/6."

"Saiki aku ngerti apa tegese nalika sampeyan ngomong yen mung pangembang kelas sing ngerti carane mbandhingake kanthi bener."

"Ya, nanging mung setengah crita.  Ana cara liyane: hashCode (). "

"Kabeh babagan metode sing padha saiki, nanging kenapa kita butuh  kode hash ()? "

" Cara hashCode dibutuhake kanggo mbandhingake cepet."

" Cara witjaksono duwe downside utama: kerjane alon banget. Upaminipun sampeyan duwe Set yuta unsur lan kudu mriksa apa ngemot obyek tartamtu. Kepiye carane?"

"Aku bisa siklus liwat kabeh unsur nggunakake daur ulang lan mbandhingaké obyek karo saben obyek ing pesawat. Nganti aku nemokake match."

"Lan yen ora ana? Kita bakal nindakake sejuta mbandhingake mung kanggo ngerteni manawa obyek kasebut ora ana? Apa ora kaya ngono?"

"Ya, malah aku ngerti sing akeh banget mbandhingake. Apa ana cara liya?"

"Ya, sampeyan bisa nggunakake hashCode () kanggo iki.

Metode hashCode () ngasilake nomer tartamtu kanggo saben obyek. Pangembang kelas mutusake nomer apa sing bakal bali, kaya sing ditindakake kanggo metode sing padha.

"Ayo deleng conto:"

"Bayangake yen sampeyan duwe yuta nomer 10 digit. Banjur, sampeyan bisa nggawe hashCode saben nomer dadi sisa sawise dibagi nomer kanthi 100."

Iki contone:

Nomer Kode hash kita
1234567890 90
9876554321 21
9876554221 21
9886554121 21

"Ya, iku ndadekake pangertèn. Lan apa sing kita tindakake karo hashCode iki?"

"Tinimbang mbandhingaké nomer, kita mbandhingaké hashCodes sing . Iku luwih cepet sing cara."

"Lan kita nelpon padha mung yen hashCodes padha."

"Ya, sing luwih cepet. Nanging kita isih kudu nggawe yuta bandingaken. Kita mung mbandhingaké nomer cilik, lan kita isih kudu nelpon witjaksono kanggo sembarang nomer karo cocog hashCodes."

"Ora, sampeyan bisa lolos kanthi jumlah perbandingan sing luwih cilik."

"Mbayangno yen Set kita nyimpen nomer sing diklompokaké utawa diurutake miturut hashCode (ngurutake kanthi cara iki ateges nglumpukake, amarga nomer kanthi kode hash sing padha bakal ana ing jejere). kanggo mriksa sapisan saben klompok kanggo ndeleng apa hashCode cocog karo hashCode obyek."

"Mbayangno sampeyan mahasiswa looking for kanca sing bisa dikenali dening ngarsane lan sing kita ngerti manggon ing Dorm 17. Banjur sampeyan mung menyang saben asrama ing universitas lan takon, 'Apa iki Dorm 17?' Yen ora, sampeyan ora nglirwakake kabeh wong ing asrama lan nerusake menyang sabanjure. Yen jawabane 'ya', banjur sampeyan miwiti mlaku liwat saben kamar, nggoleki kanca sampeyan."

"Ing conto iki, nomer asrama (17) minangka kode hash."

"A pangembang sing ngleksanakake fungsi hashCode kudu ngerti ing ngisor iki:"

A)  rong obyek sing beda bisa duwe kode hash sing padha  (wong sing beda bisa manggon ing asrama sing padha)

B)  obyek sing padha  ( miturut cara sing padhakudu duwe kode hash sing padha. .

C)  kode hash kudu dipilih supaya ora akeh obyek sing beda karo kode hash sing padha.  Yen ana, banjur kaluwihan potensial hashcodes ilang (Sampeyan njaluk menyang Dorm 17 lan golek sing setengah universitas manggon ana. Bummer!).

"Lan saiki sing paling penting. Yen sampeyan ngilangi metode sing padha , sampeyan kudu ngilangi metode hashCode () lan tundhuk karo telung aturan kasebut ing ndhuwur.

"Alesane iki: ing Jawa, obyek ing koleksi tansah dibandhingake / dijupuk nggunakake hashCode () sadurunge padha dibandhingake / dijupuk nggunakake witjaksono  . malah ora bakal disebut.

"Ing conto Fraksi, yen kita nggawe kode hash padha karo numerator, fraksi 2/3 lan 4/6 bakal duwe kode hash sing beda. Fraksi kasebut padha lan metode sing padha nyatakake yen padha, nanging kode hash kasebut ujar. Lan yen kita mbandhingake nggunakake kode hash sadurunge mbandhingake nggunakake padha, banjur kita nyimpulake yen obyek kasebut beda lan kita ora nate nggawe metode sing padha.

Iki contone:

HashSet<Fraction>set = new HashSet<Fraction>();
set.add(new Fraction(2,3));System.out.println( set.contains(new Fraction(4,6)) );
Yen metode hashCode ()  ngasilake numerator pecahan, asile bakal  palsu .
Lan obyek «Pecahan anyar (4,6) » ora bakal ditemokake ing koleksi.

"Dadi apa cara sing bener kanggo ngetrapake kode hash kanggo pecahan?"

"Ing kene sampeyan kudu ngelingi yen pecahan sing padha kudu duwe kode hash sing padha."

" Versi 1 : hashCode padha karo asil divisi integer."

"Kanggo 7/5 lan 6/5, iki bakal dadi 1."

"Kanggo 4/5 lan 3/5, iki bakal dadi 0."

"Nanging pilihan iki kurang cocog kanggo mbandhingake pecahan sing sengaja kurang saka 1. HashCode (asil saka divisi integer) bakal tansah 0."

" Versi 2 : hashCode padha karo asil divisi integer saka denominator dening numerator."

"Pilihan iki cocok kanggo kedadean ngendi pecahan kurang saka 1. Yen pecahan kurang saka 1, banjur invers luwih saka 1. Lan yen kita mbalikke kabeh pecahan, banjur mbandhingaké ora kena pengaruh.

"Versi pungkasan kita nggabungake loro solusi:"

public int hashCode()
{
return numerator/denominator + denominator/numerator;
}

Ayo dites nganggo 2/3 lan 4/6. Dheweke kudu duwe kode hash sing padha:

Pecahan 2/3 Pecahan 4/6
numerator / denominator 2/3 == 0 4/6 == 0
denominator / numerator 3/2 == 1 6/4 == 1
numerator / denominator
+
denominator / numerator
0 + 1 == 1 0 + 1 == 1

"Iku kabeh kanggo saiki."

"Thanks, Ellie. Iku pancene menarik."