tgoop.com/javapro_ir/4269
Last Update:
اگر تا حالا با جاوا کار کرده باشید، احتمالاً از HashMap استفاده کردهاید.
اما آیا واقعاً میدانید پشت صحنه چه اتفاقی میافتد؟
در ادامه به زبانی ساده و قابل فهم توضیح داده شده که HashMap چطور داخل خودش دادهها را مدیریت میکند 👇
🔹 ساختار کلی:
✅ در داخل HashMap، یک آرایه از «باکتها» وجود دارد.
✅ هر باکت میتواند چند «کلید-مقدار» را به صورت نود (گره) ذخیره کند.
✅ اگر چند کلید مختلف به یک باکت برسند، دادهها به صورت لیست پیوندی ذخیره میشوند (از نسخه ۸ جاوا به بعد، اگر تعداد زیاد شود، تبدیل به درخت Red-Black میشود).
🔹 هش کردن و پیدا کردن موقعیت:
🤔 وقتی یک کلید به HashMap اضافه میشود:
✅ جاوا با استفاده از متد hashCode() یک مقدار هش برای آن تولید میکند.
✅ بعد با این فرمول محل دقیق قرار گرفتن آن در آرایه مشخص میشود:
👨🏻💻 index = (n - 1) & hash
این روش باعث میشود کلیدها بهطور یکنواخت در آرایه پخش شوند و دسترسی سریعتر انجام شود.
🔹 برخورد چند کلید در یک جا:
🤔 اگر چند کلید به یک باکت برسند:
✅ اول جاوا بررسی میکند آیا کلید جدید با یکی از کلیدهای موجود برابر است (equals()).
✅ اگر برابر نباشد، کلید جدید به لیست یا درخت اضافه میشود.
🔹 تبدیل به درخت (در جاوا ۸ به بعد):
اگر تعداد نودها در یک باکت بیشتر از ۸ تا شود و کل اندازه نقشه حداقل ۶۴ باشد، لیست پیوندی به درخت Red-Black تبدیل میشود تا جستجوها سریعتر انجام شود (O(log n) بهجای O(n)).
🔹 ظرفیت، ضریب بار و آستانه:
✅ ظرفیت: تعداد باکتهای فعلی (پیشفرض ۱۶ عدد است)
✅ ضریب بار: عددی بین ۰ و ۱ (پیشفرض ۰٫۷۵) که مشخص میکند چه زمانی باید ظرفیت بیشتر شود
✅ آستانه: ظرفیت × ضریب بار؛ اگر تعداد عناصر از این مقدار بیشتر شود، HashMap بزرگتر میشود.
🔁 بزرگتر شدن (Resizing):
🤔 وقتی تعداد عناصر از آستانه عبور کند:
✅ ظرفیت آرایه دو برابر میشود
✅ همه کلیدها دوباره هش میشوند و در آرایه جدید قرار میگیرند
✅ این فرآیند زمانبر است، پس اگر از ابتدا ظرفیت مناسب انتخاب شود، کارایی بهتری خواهید داشت.
🔹 مدیریت null:
✅ HashMap فقط یک کلید null را قبول میکند
✅ اما میتواند چندین مقدار null داشته باشد
✅ کلید null همیشه در باکت شماره صفر ذخیره میشود.
💡 نکته مهم:
اگر از کلاسهای خودتان بهعنوان کلید استفاده میکنید، حتماً متدهای equals() و hashCode() را بازنویسی (override) کنید.
این کار از بروز خطا جلوگیری میکند و باعث میشود HashMap درست کار کند.
📈 چرا دانستن این نکات مهم است؟
✔️ به شما کمک میکند کدی سریعتر و بهینهتر بنویسید
✔️ برای مصاحبههای شغلی و طراحی سیستم آمادگی بیشتری خواهید داشت
✔️ درک عمیقتری از مجموعههای جاوا بهدست میآورید
اگر به جاوا، Spring Boot یا طراحی بکاند علاقهمندید، جاواپرو را دنبال نمایید 🙌
#جاواپرو #SpringBoot #جاوا