যা আলগোরিদিম জাভার হ্যাশম্যাপ ব্যবহার করছে তা নিয়ে কিছুটা বিভ্রান্তি রয়েছে (সান / ওরাকল / ওপেনজেডিকে বাস্তবায়নে), এখানে উত্স সম্পর্কিত প্রাসঙ্গিক কোড স্নিপেটস (ওপেনজেডিকে, 1.6.0_20 থেকে):
final Entry<K,V> getEntry(Object key) {
int hash = (key == null) ? 0 : 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 != null && key.equals(k))))
return e;
}
return null;
}
এই পদ্ধতিটি (উদাহরণস্বরূপ 355 থেকে 371 লাইন থেকে থাকে) টেবিলটিতে প্রবেশের সন্ধান করার সময় ডাকা হয়, উদাহরণস্বরূপ get()
, containsKey()
এবং অন্য কিছু থেকে । এখানে লুপটি এন্ট্রি অবজেক্ট দ্বারা গঠিত লিঙ্কযুক্ত তালিকার মধ্য দিয়ে যায়।
এন্ট্রি অবজেক্টগুলির জন্য কোড (লাইন 691-705 + 759):
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
final int hash;
Entry(int h, K k, V v, Entry<K,V> n) {
value = v;
next = n;
key = k;
hash = h;
}
}
ঠিক এই পরে addEntry()
পদ্ধতি আসে :
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
if (size++ >= threshold)
resize(2 * table.length);
}
এটি পুরাতন প্রথম প্রবেশের লিঙ্ক সহ বালতির সামনের নতুন এন্ট্রি যুক্ত করেছে (বা নাল, যদি না থাকে তবে)। একইভাবে, removeEntryForKey()
পদ্ধতিটি তালিকার মধ্য দিয়ে যায় এবং কেবলমাত্র একটি প্রবেশিকা মুছে ফেলার জন্য যত্ন নেয়, তালিকার বাকি অংশটি অক্ষত রেখে দেয়।
সুতরাং, এখানে প্রতিটি বালতিটির জন্য একটি লিঙ্কযুক্ত এন্ট্রি তালিকা রয়েছে এবং আমি খুব সন্দেহ করি যে এটি থেকে পরিবর্তিত _20
হয়েছে _22
, যেহেতু এটি 1.2 থেকে শুরু হয়েছিল।
(এই কোডটি (সি) 1997-2007 সান মাইক্রোসিস্টেমস, এবং জিপিএল এর অধীনে উপলভ্য, তবে মূল ফাইলটি আরও ভালভাবে অনুলিপি করার জন্য, সান / ওরাকল থেকে প্রতিটি জেডিকে এসসিআর.জিপ অন্তর্ভুক্ত রয়েছে এবং ওপেনজেডিকেও রয়েছে।)