Map HashMap in Java
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- Map
یک اینترفیس یا Interface در جاوا است که دادهها را بهصورت جفتهای کلید-مقدار یا Key-Value ذخیره میکند.
- Key
شناسهای منحصربهفرد در یک Map است که برای دسترسی به مقدارها استفاده میشود. کلیدها نمیتوانند تکراری باشند و باید Unique باشند.
- Value
دادهای است که به یک کلید خاص متصل شده است. برخلاف کلیدها، مقدارها میتوانند تکراری باشند.
- HashMap
یکی از پیادهسازیهای معروف Map است که دادهها را بر اساس مکانیزم هشینگ یا Hashing ذخیره میکند. این ساختار در عملیات درج و جستجو سرعت بالایی دارد، اما ترتیب ورود دادهها را حفظ نمیکند.
- LinkedHashMap
نوعی از Map است که رفتاری مشابه HashMap دارد، با این تفاوت که ترتیب درج عناصر یا Insertion Order را حفظ میکند.
- TreeMap
پیادهسازی دیگری از Map است که عناصر را بر اساس ترتیب طبیعی کلیدها یا یک Comparator سفارشی، بهصورت مرتبشده یا Sorted نگه میدارد.
- Entry
یک آبجکت است که نماینده یک جفت کلید و مقدار در مپ محسوب میشود. از طریق entrySet() میتوان به این جفتها دسترسی داشت.
موارد مصاحبه ای
- تفاوت اصلی بین کلید و مقدار در Map چیست؟
کلیدها حتماً باید منحصربهفرد یا Unique باشند، اما مقدارها یا Values میتوانند تکراری باشند.
- اگر یک کلید تکراری را مجدداً در Map درج کنیم، چه اتفاقی میافتد؟
اگر با متد put یک کلید تکراری را دوباره در Map قرار دهیم، مقدار جدید جایگزین مقدار قبلی میشود. در این حالت، متد put مقدار قدیمی را بهعنوان خروجی برمیگرداند.
- چرا متد
keySetیکSetبرمیگرداند اما متدvaluesیکCollection؟
چون کلیدها در مپ همیشه منحصربهفرد هستند و این ویژگی، رفتار اصلی ساختار Set است. اما مقدارها میتوانند تکراری باشند و لزوماً ویژگیهای یک ست را ندارند؛ بنابراین متد values یک Collection برمیگرداند.
- کدام پیادهسازیهای Map اجازه استفاده از کلید نال
null keyرا میدهند؟
HashMap و LinkedHashMap اجازه میدهند یک کلید null داشته باشید. اما TreeMap اجازه استفاده از کلید null را نمیدهد.
- تفاوت متد
remove(key)باremove(key, value)در چیست؟
متد remove(key) فقط با دریافت کلید، آن را حذف میکند و مقدار مربوط به آن را برمیگرداند.
متد remove(key, value) فقط زمانی جفت موردنظر را حذف میکند که هم کلید و هم مقدار دقیقاً با ورودیها مطابقت داشته باشند. خروجی این متد از نوع boolean است.
سناریو کاربردی
در این آموزش، نحوه کار با یک دفترچه تلفن ساده یا لیست ذخیرهسازی اطلاعات با استفاده از HashMap شبیهسازی شده است:
۱. تعریف و مقداردهی
ابتدا یک Map با کلید از نوع Integer، یعنی شناسه، و مقدار از نوع String، یعنی نام، تعریف میشود.
۲. افزودن داده
با استفاده از متد put دادههایی مانند (1, "First") اضافه میشوند.
۳. بهروزرسانی
نشان داده شد که اگر دوباره برای کلید 1 مقدار جدیدی با متد put ثبت شود، مقدار قبلی تغییر میکند و مقدار جدید جایگزین آن میشود.
۴. حذف
با استفاده از متد remove و بر اساس کلید، یک آیتم از لیست حذف میشود.
۵. پیمایش Iteration
برای چاپ تمام اعضا، از متد entrySet() داخل یک حلقه for-each استفاده میشود. در هر مرحله، به ازای هر Entry در مپ، متدهای getKey() و getValue() صدا زده میشوند.
بیشتر بدانید
- نکته متد put
خروجی متد put از نوع همان Value تعریفشده در مپ است. اگر کلید از قبل وجود داشته باشد، مقدار قبلی آن را برمیگرداند و اگر وجود نداشته باشد، مقدار null برمیگرداند.
- بررسی وجود داده
با استفاده از متدهای containsKey(key) و containsValue(value) میتوانید بدون خطا گرفتن، از وجود یک کلید یا مقدار خاص در مپ مطمئن شوید.
- پاکسازی کلی
متد clear() تمام اعضای موجود در مپ را حذف میکند و سایز آن را به صفر میرساند.
- مدیریت در محیطهای چندرشتهای
برای کار در محیطهای Multi-threading، میتوان از Hashtable که Synchronized است یا از ConcurrentHashMap استفاده کرد.
