Umume sampeyan bakal setuju yen
Sampeyan bisa maca liyane babagan iki: Nggarap kode hash lan metode sing padha ing Jawa
HashMap
dina iki minangka topik sing paling disenengi kanggo diskusi sajrone wawancara. Kadhangkala aku duwe diskusi sing padha karo kanca-kancaku lan pancen mbantu. Saiki aku bakal duwe rembugan karo sampeyan. Aku nganggep yen sampeyan kasengsem ing internal lan cara kerja HashMap, mula sampeyan wis ngerti dasar-dasar HashMap , mula aku bakal ngliwati bagean kasebut. Nanging yen sampeyan anyar babagan iki, aku saranake sampeyan pindhah menyang situs Java Docs . Sadurunge nerusake, aku menehi saran supaya sampeyan mriksa artikel sadurunge: Nggarap kode hash lan metode sing padha ing Jawa. Isi artikel iki:
- Jawaban mung bisa.
- Apa Hashing.
- A sethitik babagan kelas
Entry
. - Apa sing
put()
. - Cara kerjane
get()
. - Cathetan
Jawaban mung bisa
Yen ana sing njaluk aku nerangake " Kepiye cara HashMap?" ", Aku mung bakal mangsuli: " Miturut prinsip Hashing ." Iku ora bisa dadi luwih prasaja. Kanggo ngerti iki lan entuk jawaban lengkap, sampeyan kudu yakin sampeyan ngerti dhasar Hashing. bener?Apa Hashing
Hashing ing wangun sing paling gampang yaiku cara ngowahi variabel / obyek dadi kode unik sawise ngetrapake rumus / algoritma kanggo properti kasebut. Fungsi hash sing bener kudu ngetutake aturan ing ngisor iki: Fungsi hash kudu ngasilake kode hash sing padha nalika ditrapake ing obyek sing padha utawa padha. Ing tembung liya, rong obyek sing padha kudu ngasilake kode hash sing padha.Cathetan: Kabeh obyek ing java marisi implementasine standar hashCode() saka fungsi sing diterangake ing kelas Object . Fungsi iki ngasilake kode hash sing dipikolehi kanthi ngowahi alamat internal obyek dadi nomer, sing ndadékaké nggawe kode unik kanggo saben obyek. |
A sethitik babagan kelas Entry
Miturut definisi, peta minangka "obyek sing nyimpen nilai lan tombol kanthi pasangan". Cukup prasaja, bener? Dadi, kudu ana sawetara mekanisme ing HashMap sing nyimpen pasangan Nilai lan Kunci? Wangsulan - Ya.HashMap
nduweni kelas batin Entry
sing katon kaya iki:
static class Entry implements Map.Entry
{
final K key;
V value;
Entry next;
final int hash;
...//остальной code тут…
}
Alami, kelas kasebut Entry
nduweni Kunci lan Nilai sing disimpen minangka atribut. Tombol ditandhani minangka final
lan kita uga ndeleng rong lapangan tambahan: next
lan hash
. Kita bakal nyoba mangertos tujuan lapangan kasebut nalika artikel kasebut maju.
Apa cara Java put()?
Sadurunge kita nyilem menyang implementasine saka caraput()
, iku penting banget kanggo ngerti sing kedadean saka kelas Entry
disimpen ing Uploaded. Kelas HashMap nemtokake variabel iki minangka:
/**
* Размер таблицы, изменяется при необходимости. Длина всегда должна быть
* кратна двум!
*/
transient Entry[] table;
Saiki deleng kode implementasi metode put()
:
/**
* Связывает определенное meaning с определенным ключом в этой карте(map).
* Если карта перед этим содержала meaning для данного ключа, это meaning
* заменится на новое.
*
* @param key
* ключ с которым указанное meaning должно быть связано.
* @param value
* meaning которое должно быть связано с ключом.
* @return вернет предыдущее meaning связанное с key, or null
* если не было значений связанных с key. (Вернет null
* так же, если перед этим key был связан со meaningм null)
*/
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<k , V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
Ayo ngerteni langkah demi langkah:
- Kaping pisanan, kita mriksa apa kunci kasebut ana. Yen tombol ora ana (
null
), Nilai diselehake ing meja ing posisi nul amarga kode hash kanggo nilai punikanull
,.это – всегда 0
- Ing langkah sabanjure, nilai hash diwilang nggunakake kode hash saka tombol sing dipikolehi kanthi nelpon metode kasebut
hashCode()
. Nilai hash iki digunakake kanggo ngetung posisi ing array ing ngendi obyek bakal diselehakeEntry
. Desainer JDK nganggep yen fungsi sing ditulis kanthi apikhashCode()
bisa ngasilake nilai hash sing dhuwur banget utawa kurang. Kanggo ngatasi masalah iki, padha ngenalakenhash()
fungsi liyane lan liwati Nilai hash obyek menyang kanggo nggawe Nilai hash cocog karo ukuran Uploaded. - Saiki fungsi kasebut diarani
indexFor(hash, table.length)
kanggo ngetung posisi sing tepat ing ngendi obyek bakal diselehakeEntry
. - Iki ngendi bagean utama diwiwiti. Saiki, adhedhasar apa sing kita ngerti yen rong obyek sing ora padha bisa duwe kode hash sing padha, kita takon: Apa rong obyek sing beda bakal dilebokake ing posisi sing padha ing array [ember]? Jawabane
LinkedList
. Yen sampeyan ngelingi, kelas kasebutEntry
nduweni atribut "next
". Atribut iki tansah nuduhake obyek sabanjure ing rantai. Iki pancen kelakuaneLinkedList
.
Entry
disimpen ing wangun LinkedList
. Nalika obyek Entry
bakal diselehake ing lokasi tartamtu, HashMap mriksa apa wis ana entri ing lokasi kasebut. Yen ora ana entri, banjur obyek diselehake ing posisi iki. Nanging, yen wis ana obyek ing posisi iki, atribut sabanjure dicenthang. Yen bali null
lan obyek saiki Entry
dadi link sabanjuré ing LinkedList
. Yen variabel sabanjure ora ana null
, prosedur kasebut diulang maneh kanggo variabel sabanjure nganti ketemu null
. Apa yen kita sijine obyek liyane karo nilai beda nanging karo tombol padha sadurunge? Logis iki kudu nyebabake nilai lawas diganti. Kepiye kedadeyan iki? Umumé, sawise nemtokake posisi obyek Entry
, nalika ngliwati LinkedList
posisi sing diwilang, HashMap
diarani metode mbandhingake tombol kanggo saben obyek Entry
. Kabeh Entry
obyek kasebut LinkedList
bisa uga duwe kode hash sing padha, nanging cara kasebut equals()
bakal mriksa kemiripan sing bener. Iki mung bakal ngganti nilai ing Entry
. Mangkono, HashMap njamin keunikan kabeh tombol.
Kepiye cara Java get () bisa digunakake?
Saiki kita duwe ide babagan carane pasangan kunci-nilai disimpen ingHashMap
. Pitakonan gedhe sabanjure yaiku: Apa sing kedadeyan nalika obyek dilewati saka HashMap menyang metode get()
? Kepiye regane obyek ditemtokake? Kita kudu ngerti jawaban kasebut, amarga cara nemtokake keunikan kunci ing metode kasebut put()
nduweni logika sing padha karo metode kasebut get()
. Sawise HashMap
nemtokake kunci obyek sing diterusake minangka argumen, mung ngasilake nilai sing cocog Entry
. Yen ora ana sing cocog, cara kasebut get()
bakal bali null
. Ayo ndeleng kode kasebut:
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<k,V>e=table[indexFor(hash,table.length)];e!=null;e=e.next){
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
Kode ing ndhuwur padha karo cara put()
nganti titik iki if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
, banjur mung ngasilake nilai obyek.
Cathetan
- Struktur data sing bakal disimpen ing obyek
Entry
yaiku array kanthi jenengtable
lan jinisEntry
. - Saben posisi individu ing larik kasebut diarani ember amarga bisa ngemot unsur pisanan
LinkedList
saka obyek kasebutEntry
. hashCode()
Tombol dibutuhake kanggo ngetung posisi obyekEntry
.equals()
Tombol digunakake kanggo mriksa uniqueness saka tombol ing peta (map
).hashCode()
lanequals()
Nilai ora digunakake ing caraget()
lanset()
ingHashMap
.- Kode hash kanggo tombol karo nilai
null
tansah 0. Lan obyek kuwiEntry
bakal tansah disimpen ing posisi nul Uploaded.
GO TO FULL VERSION