get
ing put
HashMap?". Ing kene aku bakal nyoba nerangake fungsi internal nggunakake conto sing gampang. Tanpa akeh banget teori, kita bakal miwiti karo conto supaya sampeyan bisa luwih ngerti lan banjur ndeleng carane uga cara get
ing put
Jawa . Ayo njupuk conto sing prasaja banget. Kita duwe kelas Country
(Inggris "negara"), kita bakal nggunakake obyek kelas Country
minangka kunci, lan jeneng ibukutha negara iki minangka nilai. Ing ngisor iki conto kanggo mbantu kita ngerti carane pasangan kunci-nilai bakal disimpen ing peta hash.
1. Negara.Jawa
package org.arpit.javapostsforlearning;
public class Country {
String name;
long population;
public Country(String name, long population) {
super();
this.name = name;
this.population = population;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getPopulation() {
return population;
}
public void setPopulation(long population) {
this.population = population;
}
// если длина имени в an objectе Country - четное число,
// то возвращаем 31(любое случайное число), а если нечетное - 95 (любое случайное число).
// указанный ниже метод - это не самый лучший способ генерации хеш-codeа,
// но мы воспользуемся им для более четкого понимания хеш-карт.
@Override
public int hashCode() {
if(this.name.length()%2==0)
return 31;
else
return 95;
}
@Override
public boolean equals(Object obj) {
Country other = (Country) obj;
if (name.equalsIgnoreCase((other.name)))
return true;
return false;
}
}
Yen sampeyan pengin ngerti lan sinau luwih akeh babagan metode hashcode
lan padha, sampeyan bisa tindakake link iki .
2. HashMapStructure.java(kelas utama)
import java.util.HashMap;
import java.util.Iterator;
public class HashMapStructure {
/**
* @author Arpit Mandliya
*/
public static void main(String[] args) {
Country india=new Country("India",1000);
Country japan=new Country("Japan",10000);
Country france=new Country("France",2000);
Country russia=new Country("Russia",20000);
HashMap<country,string> countryCapitalMap=new HashMap<country,string>();
countryCapitalMap.put(india,"Delhi");
countryCapitalMap.put(japan,"Tokyo");
countryCapitalMap.put(france,"Paris");
countryCapitalMap.put(russia,"Moscow");
Iterator<country> countryCapitalIter=countryCapitalMap.keySet().iterator();//установите
//debug-точку на этой строке(23)
while(countryCapitalIter.hasNext())
{
Country countryObj=countryCapitalIter.next();
String capital=countryCapitalMap.get(countryObj);
System.out.println(countryObj.getName()+"----"+capital);
}
}
}
Saiki setel breakpoint menyang baris 23 lan mbukak run -> debug as-> aplikasi java (cathetan penerjemah - bener kanggo Eclipse). Program bakal mungkasi eksekusi ing baris 23, banjur klik-tengen ing countryCapitalMap banjur pilih watch . Sampeyan bakal weruh tabel kaya iki: Ing ngisor iki kita ndeleng:
-
Ana array
Entry[]
saka 16 sel jenengetable
; -
Array iki nyimpen obyek saka kelas
Entry
. Kelas kasebutHashMap
nduweni kelas batin -Entry
. Lan conto kelas iki minangka pasangan nilai kunci. Ayo ndeleng struktur kelasEntry
: -
Saben-saben kita nyoba nggawe pasangan kunci-nilai ing peta hash, obyek kelas bakal digawe kanggo pasangan kasebut
Entry
lan bakal disimpen ing tabel ing ndhuwurEntry[]
. Lan saiki sampeyan kudu mikir ngendi persis ing tabel iki obyek bakal ditulis (ing sel). Kanggo kunci ing pasangan kunci-nilai, kode hash diwilang nggunakakehashcode()
. Lan kode hash iki digunakake kanggo ngetung nomer sel tabelEntry[]
; -
Saiki yen sampeyan ndeleng sel 10 saka tabel, sampeyan bakal weruh obyek kelas
Entry
jenengeHashMap$Entry
; - Kita nambahake 4 pasangan kunci-nilai, nanging mung ana 2 ing array!!! Iki amarga yen 2 obyek duwe kode hash sing padha, mula bakal disimpen ing sel sing padha. Nanging carane? Obyek bakal disimpen minangka dhaptar pranala (
LinkedList
).
static class Entry implements Map.Entry
{
final K key;
V value;
Entry next;
final int hash;
...//продолжение codeа
}
Hashcode for Japan = 95 так How длина слова Japan имеет нечетное количество букв.
Hashcode for India = 95 так How длина слова India имеет нечетное количество букв.
HashCode for Russia = 31 так How длина слова Russia имеет четное количество букв.
HashCode for France = 31 так How длина слова France имеет четное количество букв.
Tokoh ing ngisor iki bakal nerangake ide dhaptar sing disambung: Saiki sampeyan wis ngerti babagan struktur peta hash, ayo pindhah menyang metode put
lan get
.
Ndekek:
Ayo ndeleng carane cara iki digunakake:/**
* Метод связывает указанное meaning с указанным ключом в данной хэш-карте. Если
* карта до этого уже содержала некоторое meaning, соответствующее этому ключу,
* то старое meaning заменяется на указанное.
* @param key
* ключ, с которым связывается указанное meaning
* @param value
* meaning, связываемое с указанным ключом
* @возвращает meaning связанное с <tt>ключом</tt>, or <tt>null</tt>,
* если ниHowое meaning не соответствует <tt>ключу</tt>. ( Возврат <tt>null</tt>
* может так же говорить о том, что в карте заведомо <tt>null</tt> был связан с
* <tt>ключом</tt>.)
*/
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;
}
Saiki ayo nyoba ngerti kode iki kanthi langkah:
-
Kita mriksa obyek
key
kanggo kesetaraannull
. Yen mangkono, obyek kasebutkey
bakal disimpen ing lokasitable[0]
amarga kode hash kanggonull
tansah 0; -
key
Sabanjure, kita nelpon metode obyekhashcode()
, sing bakal ngetung kode hash. Kode hash iki digunakake kanggo nemtokake sel array ing ngendi obyek kelas bakal disimpenEntry
. Kadhangkala fungsi ikihashcode
ora ditulis kanthi trampil, mula pangembang JDK nggawe fungsi sing beda -hash()
, sing njupuk kode hash sing diwilang sadurunge minangka argumen. Yen sampeyan kasengsem maca babagan fungsi iki kanthi luwih rinci, sampeyan bisa tindakake link ; -
indexFor(hash,table.length)
digunakake kanggo netepake sel tartamtu ing arraytable
sing obyek kelas bakal ditetepake kanggo disimpenEntry
; -
Kaya sing kita deleng ing conto, yen rong obyek
key
duwe kode hash sing padha (kahanan iki dikenal minangka tabrakan), banjur bakal disimpen ing wangun dhaptar sing disambung. Mulane, ing tataran iki, kita ngulang dhaptar kita: -
yen sel sing mentas diwilang kosong, obyek kelas
Entry
bakal disimpen langsung menyang sel iki; -
yen sel iki wis ngemot sawetara obyek, banjur iterates menyang unsur kang kolom
next
padha karonull
. Sawise iki, obyek kelas kitaEntry
dadi sabanjure ing dhaptar; -
apa yen kita nambah obyek padha
key
maneh? Logis, kudu ngganti nilai lawas. Ya, bakal dadi. Sajrone pengulangan, tombol bakal dibandhingake nggunakake metodeequals()
(key.equals(k)
). Yen asile bener, nilai lawas bakal diganti karo nilai obyek saikiEntry
.
entuk:
Saiki ayo nimbang aplikasi metode kasebut/**
* returns meaning, которое соответствует указанному ключу, or {@code null}, если
* данная карта не содержит пары с указанным ключом.
*
*
* <p>
* Более точно, если в данной карте содержится такой ключ {@code k}
* с соответствующим ему meaningм {@code v}, что {@code (key==null ? k==null : key.equals(k))},
* то метод возвращает {@code v}; в противном случае возвращается {@code null}.
* (может быть не более одной такой пары)
*
* </p><p>
* Возвращенное meaning {@code null} не <i>обязательно</i> говорит о том, что
* в карте нет пары с таким указанным ключом; а возможно, что в карте однозначно
* указано соответствие этого ключа со meaningм {@code null}.
* Можно воспользоваться операцией {@link #containsKey containsKey}, чтобы
* отличить эти два случая
* @see #put(Object, Object)
*/
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;
}
Saiki sampeyan duwe pangerten babagan cara kerjane metode put ing hashmaps, ngerti cara kerjane metode put
get
gampang banget. Yen sampeyan ngliwati kunci apa wae menyang metode kanggo entuk nilai saka peta hash:
-
Objek
Ekey diuji kesetaraan null
. Yen mangkono, nilai obyek sing disimpen ing sel bakal balitable[0]
; -
Obyek kunci nduweni metode
hashcode()
sing diarani ngetung kode hash; -
indexFor(hash,table.length)
digunakake kanggo nemtokake sel array tartamtutable
saka ngendi kanggo njupuk obyek kelasEntry
; -
Sawise nampa nomer sel array,
table
bakal ngulang dhaptar lan mbandhingake tombol nggunakake metodeequals()
. Yen asil bener, banjur Nilai saka obyek bakal baliEntry
, digunakake -null
.
Bab sing kudu dielingi:
-
Kelas kasebut
HashMap
nduweni kelas batinEntry
sing nyimpen pasangan kunci-nilai; -
Obyek saka kelas
Entry
disimpen ing larikEntry[ ]
disebuttable
; -
Sel array diarani ember lan nyimpen unsur pisanan saka dhaptar sing disambung;
-
Metode
hashcode()
obyekkey
digunakake kanggo nemokake ember obyek kelas ikiEntry
; -
Yen tombol loro obyek duwe kode hash sing padha, bakal disimpen ing ember array sing padha
table
; -
Cara
equals()
obyekkey
digunakake kanggo konfirmasi keunikane; -
Metode
equals()
lanhashcode()
obyekvalue
ora digunakake ing kabeh.
GO TO FULL VERSION