JavaRush /Blog Jawa /Random-JV /Kepiye carane HashMap bisa digunakake ing Jawa
GeorgeThreeD
tingkat

Kepiye carane HashMap bisa digunakake ing Jawa

Diterbitake ing grup
Umume sampeyan bakal setuju yen HashMapdina 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. Cara kerja HashMap ing Jawa - 1Aku 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:
  1. Jawaban mung bisa.
  2. Apa Hashing.
  3. A sethitik babagan kelas Entry.
  4. Apa sing put().
  5. Cara kerjane get().
  6. 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.
Sampeyan bisa maca liyane babagan iki: Nggarap kode hash lan metode sing padha ing Jawa

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. HashMapnduweni kelas batin Entrysing katon kaya iki:
static class Entry implements Map.Entry
{
        final K key;
        V value;
        Entry next;
        final int hash;
        ...//остальной code тут…
}
Alami, kelas kasebut Entrynduweni Kunci lan Nilai sing disimpen minangka atribut. Tombol ditandhani minangka finallan kita uga ndeleng rong lapangan tambahan: nextlan hash. Kita bakal nyoba mangertos tujuan lapangan kasebut nalika artikel kasebut maju.

Apa cara Java put()?

Sadurunge kita nyilem menyang implementasine saka cara put(), iku penting banget kanggo ngerti sing kedadean saka kelas Entrydisimpen 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 punika null,.это – всегда 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 diselehake Entry. Desainer JDK nganggep yen fungsi sing ditulis kanthi apik hashCode()bisa ngasilake nilai hash sing dhuwur banget utawa kurang. Kanggo ngatasi masalah iki, padha ngenalaken hash()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 diselehake Entry.

  • 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 kasebut Entrynduweni atribut " next". Atribut iki tansah nuduhake obyek sabanjure ing rantai. Iki pancen kelakuane LinkedList.
Dadi, obyek Entrydisimpen ing wangun LinkedList. Nalika obyek Entrybakal 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 nulllan obyek saiki Entrydadi 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 LinkedListposisi sing diwilang, HashMapdiarani metode mbandhingake tombol kanggo saben obyek Entry. Kabeh Entryobyek kasebut LinkedListbisa 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 ing HashMap. 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 HashMapnemtokake 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 Entryyaiku array kanthi jeneng tablelan jinis Entry.
  • Saben posisi individu ing larik kasebut diarani ember amarga bisa ngemot unsur pisanan LinkedListsaka obyek kasebut Entry.
  • hashCode()Tombol dibutuhake kanggo ngetung posisi obyek Entry.
  • equals()Tombol digunakake kanggo mriksa uniqueness saka tombol ing peta ( map).
  • hashCode()lan equals()Nilai ora digunakake ing cara get()lan set()ing HashMap.
  • Kode hash kanggo tombol karo nilai nulltansah 0. Lan obyek kuwi Entrybakal tansah disimpen ing posisi nul Uploaded.
Muga-muga aku ngirim pikiranku kanthi bener ing artikel iki. Yen sampeyan nemokake kesalahan utawa duwe pitakon, tinggalake ing komentar. Sugeng sinau!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION