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 پر عمل درآمد روک دے گا، جس کے بعد ملک کیپیٹل میپ پر دائیں کلک کریں اور گھڑی کو منتخب کریں ۔ آپ کو اس طرح کا ایک ٹیبل نظر آئے گا: یہاں ہم مندرجہ ذیل دیکھتے ہیں۔
-
Entry[]
16 خلیات کی ایک صف ہے جس کا نام ہےtable
؛ -
یہ صف کلاس کی اشیاء کو ذخیرہ کرتی ہے
Entry
۔ کلاسHashMap
میں ایک اندرونی کلاس ہے -Entry
. اور اس کلاس کی مثالیں کلیدی قدر کے جوڑے ہیں۔ آئیے کلاس کی ساخت پر ایک نظر ڈالتے ہیںEntry
: -
جب بھی ہم ہیش میپ میں کلیدی قدر کا جوڑا بنانے کی کوشش کریں گے، اس جوڑے کے لیے ایک کلاس آبجیکٹ بنایا جائے گا
Entry
اور اسے اوپر والے جدول میں محفوظ کیا جائے گاEntry[]
۔ اور اب آپ سوچ رہے ہوں گے کہ اس ٹیبل میں یہ اعتراض کہاں لکھا جائے گا (کس سیل میں)۔ کلیدی قدر کے جوڑے میں کلید کے لیے، ہیش کوڈ کا استعمال کرتے ہوئے حساب کیا جاتا ہےhashcode()
۔ اور یہ ہیش کوڈ ٹیبل سیل نمبر کا حساب لگانے کے لیے استعمال ہوتا ہےEntry[]
۔ -
اب، اگر آپ ٹیبل کے سیل 10 کو دیکھیں تو آپ کو ایک کلاس آبجیکٹ نظر آئے گا
Entry
جس کا نام ہےHashMap$Entry
؛ - ہم نے 4 کلیدی قدر کے جوڑے شامل کیے، لیکن صف میں صرف 2 ہیں!!! اس کی وجہ یہ ہے کہ اگر 2 اشیاء کا ہیش کوڈ ایک ہی ہے، تو وہ ایک ہی سیل میں محفوظ ہوں گے۔ لیکن کس طرح؟ اشیاء کو ایک منسلک فہرست کے طور پر ذخیرہ کیا جائے گا (
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 имеет четное количество букв.
درج ذیل اعداد و شمار سے منسلک فہرست کے خیال کی وضاحت ہوگی: اب جب کہ آپ کو ہیش نقشوں کی ساخت کے بارے میں پہلے سے ہی سمجھ آ گئی ہے، آئیے 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;
}
اب آئیے اس کوڈ کو مرحلہ وار سمجھنے کی کوشش کریں:
-
key
ہم مساوات کے لیے آبجیکٹ کو چیک کرتے ہیںnull
۔ اگر ایسا ہے تو پھر آبجیکٹ کوkey
جگہ پر محفوظ کیا جائے گاtable[0]
کیونکہ ہیش کوڈnull
ہمیشہ 0 ہوتا ہے۔ -
اگلا، ہم آبجیکٹ کا
key
طریقہ کہتے ہیںhashcode()
، جو اس کے ہیش کوڈ کا حساب لگائے گا۔ اس ہیش کوڈ کا استعمال اس ارے سیل کا تعین کرنے کے لیے کیا جاتا ہے جہاں کلاس آبجیکٹ کو اسٹور کیا جائے گاEntry
۔ کبھی کبھی ایسا ہوتا ہے کہ یہ فنکشنhashcode
بہت مہارت سے نہیں لکھا جاتا ہے، اس لیے JDK ڈویلپرز نے ایک مختلف فنکشن بنایا -hash()
جو کہ پہلے کیلکولیشن کیے گئے ہیش کوڈ کو بطور دلیل لیتا ہے۔ اگر آپ اس فنکشن کے بارے میں مزید تفصیل سے پڑھنے میں دلچسپی رکھتے ہیں، تو آپ لنک پر عمل کر سکتے ہیں ؛ -
indexFor(hash,table.length)
صف میں ایک مخصوص سیل کی وضاحت کرنے کے لیے استعمال کیا جاتا ہےtable
جس میں کلاس آبجیکٹ کو ذخیرہ کرنے کی تعریف کی جائے گیEntry
؛ -
جیسا کہ ہم نے اپنی مثال میں دیکھا، اگر دو اشیاء کا
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
بہت آسان ہے۔ جب آپ ہیش میپ سے قدر حاصل کرنے کے لیے کسی طریقہ کو کوئی کلید پاس کرتے ہیں:
-
ایک چیز
Ekey برابری کے لیے آزمایا جاتا ہے null
۔ اگر ایسا ہے تو، پھر سیل میں ذخیرہ شدہ آبجیکٹ کی قدر واپس آ جائے گیtable[0]
؛ -
کلیدی آبجیکٹ کا ایک طریقہ ہے
hashcode()
جسے ہیش کوڈ کا حساب لگایا جاتا ہے؛ -
indexFor(hash,table.length)
ایک مخصوص صف کے سیل کا تعین کرنے کے لیے استعمال کیا جاتا ہےtable
جس سے کلاس آبجیکٹ لینا ہےEntry
؛ -
ارے سیل نمبر حاصل کرنے کے بعد،
table
یہ فہرست کے ذریعے اعادہ کرے گا اور طریقہ کا استعمال کرتے ہوئے چابیاں کا موازنہ کرے گاequals()
۔ اگر نتیجہ درست ہے، تو آبجیکٹ کی قدر واپس آ جائے گیEntry
، ورنہ -null
۔
یاد رکھنے کی چیزیں:
-
کلاس
HashMap
میں ایک اندرونی کلاس ہےEntry
جو کلیدی قدر کے جوڑوں کو ذخیرہ کرتی ہے۔ -
کلاس کی اشیاء کو
Entry
ایک صف میں محفوظ کیا جاتا ہےEntry[ ]
جسےtable
؛ -
ایک سرنی سیل کو بالٹی کہا جاتا ہے اور منسلک فہرست کے پہلے عنصر کو ذخیرہ کرتا ہے۔
-
اس کلاس آبجیکٹ کی بالٹی کو تلاش کرنے کے لیے
hashcode()
آبجیکٹ کا طریقہ استعمال کیا جاتا ہے ۔key
Entry
-
اگر دو آبجیکٹ کی چابیاں ایک ہیش کوڈ ہیں، تو وہ ایک ہی صف کی بالٹی میں محفوظ ہوں گی
table
۔ -
equals()
کسی چیز کا طریقہkey
اس کی انفرادیت کی تصدیق کے لیے استعمال کیا جاتا ہے۔ -
طریقوں
equals()
اورhashcode()
اشیاء کوvalue
بالکل استعمال نہیں کیا جاتا ہے۔
GO TO FULL VERSION