سلام به همه برنامه نویسهای خلاق و کنجکاو!
امروز قراره عمیق تر شیرجه بزنیم تو دنیای Map و Set. این بار از یک زاویه تخصصی تر: ساختار داخلی، متدهای hashCode و equals و نحوه ذخیره سازی داده ها. آماده اید؟ 🎯
Map: استاد کلید و مقدار! 🔑➡️💼
ساختار داخلی Map: پشت پرده چه خبره؟
HashMap یکی از پرکاربردترین پیاده سازی های Map در جاواست. تو پشت صحنه، این Map از یه آرایه از باکتها (Buckets) استفاده میکنه. هر باکت یک لیست لینک شده یا در نسخه های جدیدتر، یک Tree هست.
وقتی یه کلید-مقدار اضافه میکنید:
1️⃣ کلید هش میشه (با استفاده از متد hashCode).
2️⃣ مقدار هش تولید شده با تعداد باکتها ماژول (mod) گرفته میشه تا باکت مناسب پیدا بشه.
3️⃣ مقدار شما تو اون باکت ذخیره میشه.
⚠️ وقتی هش برابر است ولی کلیدها متفاوتند؟
اگه دو کلید مقدار هش یکسانی داشته باشن (که بهش Collision میگیم)، جاوا از متد equals استفاده میکنه تا بررسی کنه آیا این کلیدها واقعاً یکی هستن یا نه.
🧪 hashCode و equals در عمل:
این دو متد، قلب رفتار Map هستن:
💡 یادت باشه: اگر تو کلاس شخصی سازی شده ات hashCode رو بازنویسی کردی، حتماً equals رو هم بازنویسی کن.
🥁 Set: حافظ اصالت و یکتایی! 🛡️
ساختار داخلی Set:
⚠️ hashCode و equals در Set:
1️⃣ مقدار هش اون محاسبه میشه (با متد hashCode).
2️⃣ اگر هیچ مقدار مشابهی در همون باکت نباشه، مقدار ذخیره میشه.
3️⃣ اگر مقدار هش تکراری باشه، متد equals بررسی میکنه که آیا مقدار دقیقاً تکراریه یا نه.
🤔 بررسی رفتار null در Map و Set
HashMap<String, String> map = new HashMap<>();
map.put(null, "First Null"); // OK!
map.put(null, "Second Null"); // The first value is replaced.
map.put("key1", null); // OK!
TreeMap<String, String> map = new TreeMap<>();
map.put(null, "Value"); // Error!
🎯 مقایسه سریع Map و Set
📣 حرف آخر: کدام یک؟
حالا که عمیقتر با Map و Set آشنا شدیم، وقتشه که درست تصمیم بگیریم:
شما چطور از hashCode و equals تو پروژه هاتون استفاده میکنید؟ نکته خاصی دارید که اضافه کنید؟ برام بنویسید! ✍️👇