JavaRush /جاوا بلاگ /Random-UR /HashMap جاوا میں کیسے کام کرتا ہے؟
gnev
سطح

HashMap جاوا میں کیسے کام کرتا ہے؟

گروپ میں شائع ہوا۔
HashMap جاوا میں کیسے کام کرتا ہے؟  - 1اکثر انٹرویوز میں لوگ سوالات پوچھتے ہیں جیسے " HashMap جاوا میں کیسے کام کرتا ہے؟" get"، "ہیش میپ میں طریقے کیسے کام کرتے ہیں اس کا اندرونی طریقہ کار کیا ہے put؟"۔ یہاں میں ایک سادہ سی مثال کے ذریعے اندرونی فعالیت کو سمجھانے کی کوشش کروں گا۔ بہت زیادہ تھیوری میں جانے کے بغیر، ہم ایک مثال کے ساتھ شروع کریں گے تاکہ آپ بہتر طور پر سمجھ سکیں اور پھر دیکھیں کہ جاوا میں getبھی طریقے کیسے کام کرتے ہیں۔ putآئیے ایک بہت ہی آسان مثال لیتے ہیں۔ ہمارے پاس ایک کلاس ہے Country(انگریزی "ملک")، ہم کلاس آبجیکٹ کو Countryکلید کے طور پر اور اس ملک کے دارالحکومت کا نام قدر کے طور پر استعمال کریں گے۔ ذیل میں ہمیں یہ سمجھنے میں مدد کرنے کے لیے ایک مثال دی گئی ہے کہ کلیدی قدر کے جوڑے کو ہیش میپ میں کیسے ذخیرہ کیا جائے گا۔

1. ملک۔جاوا

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;
 }
}
hashcodeاگر آپ طریقوں اور مساوات کے بارے میں مزید سمجھنا اور جاننا چاہتے ہیں ، تو آپ اس لنک کو فالو کر سکتے ہیں ۔

2. HashMapStructure.java(مین کلاس)

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);
            }
        }
}
اب بریک پوائنٹ کو لائن 23 پر سیٹ کریں اور چلائیں -> debug as-> java ایپلیکیشن (مترجم کا نوٹ - ایکلیپس کے لیے درست)۔ یہ پروگرام لائن 23 پر عمل درآمد روک دے گا، جس کے بعد ملک کیپیٹل میپ پر دائیں کلک کریں اور گھڑی کو منتخب کریں ۔ آپ کو اس طرح کا ایک ٹیبل نظر آئے گا: HashMap جاوا میں کیسے کام کرتا ہے؟  - 2یہاں ہم مندرجہ ذیل دیکھتے ہیں۔
  1. Entry[]16 خلیات کی ایک صف ہے جس کا نام ہے table؛

  2. یہ صف کلاس کی اشیاء کو ذخیرہ کرتی ہے Entry۔ کلاس HashMapمیں ایک اندرونی کلاس ہے - Entry. اور اس کلاس کی مثالیں کلیدی قدر کے جوڑے ہیں۔ آئیے کلاس کی ساخت پر ایک نظر ڈالتے ہیں Entry:

  3. static class Entry implements Map.Entry
            {
                    final K key;
                    V value;
                    Entry next;
                    final int hash;
                    ...//продолжение codeа
            }
  4. جب بھی ہم ہیش میپ میں کلیدی قدر کا جوڑا بنانے کی کوشش کریں گے، اس جوڑے کے لیے ایک کلاس آبجیکٹ بنایا جائے گا Entryاور اسے اوپر والے جدول میں محفوظ کیا جائے گا Entry[]۔ اور اب آپ سوچ رہے ہوں گے کہ اس ٹیبل میں یہ اعتراض کہاں لکھا جائے گا (کس سیل میں)۔ کلیدی قدر کے جوڑے میں کلید کے لیے، ہیش کوڈ کا استعمال کرتے ہوئے حساب کیا جاتا ہے hashcode()۔ اور یہ ہیش کوڈ ٹیبل سیل نمبر کا حساب لگانے کے لیے استعمال ہوتا ہے Entry[]۔

  5. اب، اگر آپ ٹیبل کے سیل 10 کو دیکھیں تو آپ کو ایک کلاس آبجیکٹ نظر آئے گا Entryجس کا نام ہے HashMap$Entry؛

  6. ہم نے 4 کلیدی قدر کے جوڑے شامل کیے، لیکن صف میں صرف 2 ہیں!!! اس کی وجہ یہ ہے کہ اگر 2 اشیاء کا ہیش کوڈ ایک ہی ہے، تو وہ ایک ہی سیل میں محفوظ ہوں گے۔ لیکن کس طرح؟ اشیاء کو ایک منسلک فہرست کے طور پر ذخیرہ کیا جائے گا ( LinkedList)
یہاں یہ ہے کہ ہمارے کلیدی قدر کے جوڑوں کے لیے ہیش کوڈ کا حساب کیسے لگایا جائے گا۔
Hashcode for Japan = 95 так How длина слова Japan имеет нечетное количество букв.
Hashcode for India = 95 так How длина слова India имеет нечетное количество букв.
HashCode for Russia = 31 так How длина слова Russia имеет четное количество букв.
HashCode for France = 31 так How длина слова France имеет четное количество букв.
درج ذیل اعداد و شمار سے منسلک فہرست کے خیال کی وضاحت ہوگی: HashMap جاوا میں کیسے کام کرتا ہے؟  - 3اب جب کہ آپ کو ہیش نقشوں کی ساخت کے بارے میں پہلے سے ہی سمجھ آ گئی ہے، آئیے putاور طریقوں کی طرف چلتے ہیں get۔

ڈالیں:

آئیے دیکھتے ہیں کہ یہ طریقہ کیسے استعمال کیا جاتا ہے:
/**
  * Метод связывает указанное 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;
 }
اب آئیے اس کوڈ کو مرحلہ وار سمجھنے کی کوشش کریں:
  1. keyہم مساوات کے لیے آبجیکٹ کو چیک کرتے ہیں null۔ اگر ایسا ہے تو پھر آبجیکٹ کو keyجگہ پر محفوظ کیا جائے گا table[0]کیونکہ ہیش کوڈ nullہمیشہ 0 ہوتا ہے۔

  2. اگلا، ہم آبجیکٹ کا keyطریقہ کہتے ہیں hashcode()، جو اس کے ہیش کوڈ کا حساب لگائے گا۔ اس ہیش کوڈ کا استعمال اس ارے سیل کا تعین کرنے کے لیے کیا جاتا ہے جہاں کلاس آبجیکٹ کو اسٹور کیا جائے گا Entry۔ کبھی کبھی ایسا ہوتا ہے کہ یہ فنکشن hashcodeبہت مہارت سے نہیں لکھا جاتا ہے، اس لیے JDK ڈویلپرز نے ایک مختلف فنکشن بنایا - hash()جو کہ پہلے کیلکولیشن کیے گئے ہیش کوڈ کو بطور دلیل لیتا ہے۔ اگر آپ اس فنکشن کے بارے میں مزید تفصیل سے پڑھنے میں دلچسپی رکھتے ہیں، تو آپ لنک پر عمل کر سکتے ہیں ؛

  3. indexFor(hash,table.length)صف میں ایک مخصوص سیل کی وضاحت کرنے کے لیے استعمال کیا جاتا ہے tableجس میں کلاس آبجیکٹ کو ذخیرہ کرنے کی تعریف کی جائے گی Entry؛

  4. جیسا کہ ہم نے اپنی مثال میں دیکھا، اگر دو اشیاء کا keyہیش کوڈ ایک ہی ہے (اس صورتحال کو تصادم کے طور پر جانا جاتا ہے)، تو وہ لنکڈ لسٹ کی شکل میں محفوظ ہو جائیں گے۔ لہذا، اس مرحلے پر ہم اپنی فہرست کو دہراتے ہیں:

    • اگر نیا حساب شدہ سیل خالی ہے، تو کلاس آبجیکٹ Entryبراہ راست اس سیل میں محفوظ ہو جائے گا۔

    • اگر اس سیل میں پہلے سے ہی کوئی چیز موجود ہے، تو پھر اس عنصر کی طرف اعادہ کرتا ہے جس کی فیلڈ nextبرابر ہے null۔ اس کے بعد، ہماری کلاس آبجیکٹ Entryفہرست میں اگلا ہو جاتا ہے۔

    • اگر ہم ایک ہی چیز کو keyدوبارہ شامل کریں تو کیا ہوگا؟ منطقی طور پر، اسے پرانی قدر کو تبدیل کرنا چاہیے۔ ہاں ایسا ہی ہوگا۔ تکرار کے دوران، چابیاں کا موازنہ equals()( key.equals(k)) طریقہ استعمال کرتے ہوئے کیا جائے گا۔ اگر نتیجہ درست ہے، تو پرانی قدر کو موجودہ چیز کی قدر سے بدل دیا جائے گا Entry۔

حاصل کریں:

اب طریقہ کار کے اطلاق پر ایک نظر ڈالتے ہیں۔ حاصل کریں
/**
  * 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;
 }
اب جب کہ آپ کو سمجھ آ گئی ہے کہ پوٹ میتھڈ ہیش میپس میں کیسے کام کرتا ہے، یہ سمجھنا کہ پوٹ میتھڈ کیسے کام کرتا ہے getبہت آسان ہے۔ جب آپ ہیش میپ سے قدر حاصل کرنے کے لیے کسی طریقہ کو کوئی کلید پاس کرتے ہیں:
  1. ایک چیز Ekey برابری کے لیے آزمایا جاتا ہے null۔ اگر ایسا ہے تو، پھر سیل میں ذخیرہ شدہ آبجیکٹ کی قدر واپس آ جائے گی table[0]؛

  2. کلیدی آبجیکٹ کا ایک طریقہ ہے hashcode()جسے ہیش کوڈ کا حساب لگایا جاتا ہے؛

  3. indexFor(hash,table.length)ایک مخصوص صف کے سیل کا تعین کرنے کے لیے استعمال کیا جاتا ہے tableجس سے کلاس آبجیکٹ لینا ہے Entry؛

  4. ارے سیل نمبر حاصل کرنے کے بعد، tableیہ فہرست کے ذریعے اعادہ کرے گا اور طریقہ کا استعمال کرتے ہوئے چابیاں کا موازنہ کرے گا equals()۔ اگر نتیجہ درست ہے، تو آبجیکٹ کی قدر واپس آ جائے گی Entry، ورنہ - null۔

یاد رکھنے کی چیزیں:

  • کلاس HashMapمیں ایک اندرونی کلاس ہے Entryجو کلیدی قدر کے جوڑوں کو ذخیرہ کرتی ہے۔

  • کلاس کی اشیاء کو Entryایک صف میں محفوظ کیا جاتا ہے Entry[ ]جسے table؛

  • ایک سرنی سیل کو بالٹی کہا جاتا ہے اور منسلک فہرست کے پہلے عنصر کو ذخیرہ کرتا ہے۔

  • اس کلاس آبجیکٹ کی بالٹی کو تلاش کرنے کے لیے hashcode()آبجیکٹ کا طریقہ استعمال کیا جاتا ہے ۔keyEntry

  • اگر دو آبجیکٹ کی چابیاں ایک ہیش کوڈ ہیں، تو وہ ایک ہی صف کی بالٹی میں محفوظ ہوں گی table۔

  • equals()کسی چیز کا طریقہ keyاس کی انفرادیت کی تصدیق کے لیے استعمال کیا جاتا ہے۔

  • طریقوں equals()اور hashcode()اشیاء کو valueبالکل استعمال نہیں کیا جاتا ہے۔

ذریعہ
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION