JavaRush /Blog Jawa /Random-JV /Kepiye HashMap bisa digunakake ing Jawa?
gnev
tingkat

Kepiye HashMap bisa digunakake ing Jawa?

Diterbitake ing grup
Kepiye cara HashMap ing Jawa?  - 1Asring banget ing wawancara, dheweke takon kaya " Kepiye carane HashMap bisa digunakake ing Jawa?" ", "Apa mekanisme internal babagan cara cara geting putHashMap?". 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 geting putJawa . Ayo njupuk conto sing prasaja banget. Kita duwe kelas Country(Inggris "negara"), kita bakal nggunakake obyek kelas Countryminangka 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 hashcodelan 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: Kepiye cara HashMap ing Jawa?  - 2Ing ngisor iki kita ndeleng:
  1. Ana array Entry[]saka 16 sel jenenge table;

  2. Array iki nyimpen obyek saka kelas Entry. Kelas kasebut HashMapnduweni kelas batin - Entry. Lan conto kelas iki minangka pasangan nilai kunci. Ayo ndeleng struktur kelas Entry:

  3. static class Entry implements Map.Entry
            {
                    final K key;
                    V value;
                    Entry next;
                    final int hash;
                    ...//продолжение codeа
            }
  4. Saben-saben kita nyoba nggawe pasangan kunci-nilai ing peta hash, obyek kelas bakal digawe kanggo pasangan kasebut Entrylan bakal disimpen ing tabel ing ndhuwur Entry[]. Lan saiki sampeyan kudu mikir ngendi persis ing tabel iki obyek bakal ditulis (ing sel). Kanggo kunci ing pasangan kunci-nilai, kode hash diwilang nggunakake hashcode(). Lan kode hash iki digunakake kanggo ngetung nomer sel tabel Entry[];

  5. Saiki yen sampeyan ndeleng sel 10 saka tabel, sampeyan bakal weruh obyek kelas Entryjenenge HashMap$Entry;

  6. 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).
Mangkene carane kode hash kanggo pasangan kunci-nilai bakal diwilang.
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: Kepiye HashMap bisa digunakake ing Jawa?  - 3Saiki sampeyan wis ngerti babagan struktur peta hash, ayo pindhah menyang metode putlan 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:
  1. Kita mriksa obyek keykanggo kesetaraan null. Yen mangkono, obyek kasebut keybakal disimpen ing lokasi table[0]amarga kode hash kanggo nulltansah 0;

  2. keySabanjure, kita nelpon metode obyek hashcode(), sing bakal ngetung kode hash. Kode hash iki digunakake kanggo nemtokake sel array ing ngendi obyek kelas bakal disimpen Entry. Kadhangkala fungsi iki hashcodeora 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 ;

  3. indexFor(hash,table.length)digunakake kanggo netepake sel tartamtu ing array tablesing obyek kelas bakal ditetepake kanggo disimpen Entry;

  4. Kaya sing kita deleng ing conto, yen rong obyek keyduwe 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 Entrybakal disimpen langsung menyang sel iki;

    • yen sel iki wis ngemot sawetara obyek, banjur iterates menyang unsur kang kolom nextpadha karo null. Sawise iki, obyek kelas kita Entrydadi sabanjure ing dhaptar;

    • apa yen kita nambah obyek padha keymaneh? Logis, kudu ngganti nilai lawas. Ya, bakal dadi. Sajrone pengulangan, tombol bakal dibandhingake nggunakake metode equals()( key.equals(k)). Yen asile bener, nilai lawas bakal diganti karo nilai obyek saiki Entry.

entuk:

Saiki ayo nimbang aplikasi metode kasebut njaluk
/**
  * 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 getgampang banget. Yen sampeyan ngliwati kunci apa wae menyang metode kanggo entuk nilai saka peta hash:
  1. Objek Ekey diuji kesetaraan null. Yen mangkono, nilai obyek sing disimpen ing sel bakal bali table[0];

  2. Obyek kunci nduweni metode hashcode()sing diarani ngetung kode hash;

  3. indexFor(hash,table.length)digunakake kanggo nemtokake sel array tartamtu tablesaka ngendi kanggo njupuk obyek kelas Entry;

  4. Sawise nampa nomer sel array, tablebakal ngulang dhaptar lan mbandhingake tombol nggunakake metode equals(). Yen asil bener, banjur Nilai saka obyek bakal bali Entry, digunakake - null.

Bab sing kudu dielingi:

  • Kelas kasebut HashMapnduweni kelas batin Entrysing nyimpen pasangan kunci-nilai;

  • Obyek saka kelas Entrydisimpen ing larik Entry[ ]disebut table;

  • Sel array diarani ember lan nyimpen unsur pisanan saka dhaptar sing disambung;

  • Metode hashcode()obyek keydigunakake kanggo nemokake ember obyek kelas iki Entry;

  • Yen tombol loro obyek duwe kode hash sing padha, bakal disimpen ing ember array sing padha table;

  • Cara equals()obyek keydigunakake kanggo konfirmasi keunikane;

  • Metode equals()lan hashcode()obyek valueora digunakake ing kabeh.

Sumber
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION