آشنایی با کلاس HashMap در جاوا
یکی از کلاس های بسیار پرکاربرد در زبان برنامه نویسی جاوا, HashMap است. در این مقاله قصد داریم تا شیوه استفاده از این کلاس را مورد بررسی قرار دهیم.
HashMap یک کلاس از خانواده Map Collection ها است که اطلاعات را به صورت Value و Key نگهداری میکند. به این معنا که برای یک داده میتوانیم یک کلید تعریف کنیم و برای بازیابی اطلاعات مورد نظر از این کلید ها استفاده کنیم. نمونه ای از چنین ساختار را میتوانیم در نگهداری اطلاعات به صورت جدولی در نظر بگیریم. برای مثال فرض کنید یک جدول داریم که سه Field زیر را در خود نگهداری میکند:
- Username
- Password
HashMap ها را میتوانیم جداولی با یک سطر در نظر بگیریم :
Username => Vhdrjb Password => 1234 Email => Vhdrjbs@myMail.com
اگر بخواهیم نمونه فوق را با استفاده از HashMap پیاده سازی کنیم, اینگونه عمل میکنیم:
HashMap zeroToHero = new HashMap(); zerotohero.put("username", "vhdrjb"); zerotohero.put("password", "1234"); zerotohero.put("email", "vhdrjb@myMail.com");
با استفاده از متد Put, میتوانیم مقادیر را در این کلاس ذخیره کنیم. این متد به دو متغیر نیاز دارد که متغیر اول کلید و متغیر دوم مقدار را مشخص میکند. همچنین میتوانیم نوع کلید و متغیر را نیز مشخص کنیم:
HashMap<String, String> zerotohero = new HashMap<String, String>(); zerotohero.put("username", "vhdrjb"); zerotohero.put("password", "1234"); zerotohero.put("email", "vhdrjb@myMail.com");
حال اگر کلاس را به این صورت تنظیم کنیم, دیگر مقادیر نمیتوانند از نوع String باشند:
HashMap<String, Integer> zeroToHero = new HashMap<String, Integer>();
در ابتدای مقاله, این کلاس را به یک جدول یک سطری تشبیه کردیم. علت این امر این است که اگر دو مقدار را به یک کلید اختصاص دهیم, مقداری که در آخر به آن اختصاص داده شده, در کلاس نگهداری میشود. به این معنا که داده را جایگزین میکند و داده قبلی از دست میرود. برای مثال اگر به کلید passowrd مقدار ۱۲۳۴ را اختصاص دادهایم و سپس مقدار ۴۳۲۱ را برای آن ثبت کنیم, مقداری که در کلید Password نگهداری میشود برابر با ۴۳۲۱ است.
برای بازیابی اطلاعات نیز از متد Get استفاده میشود :
System.out.println(zerotohero.get("username")); /// output : true System.out.println(zerotohero.get("name")); /// output : false
اگر بخواهیم در این کلاس جستجو کنیم, از متد Contains استفاده میکنیم و نتیجه از نوع Boolean است:
System.out.println(zerotohero.containsKey("username")); /// output : true System.out.println(zerotohero.containsKey("name")); /// output : false
کد فوق در میان کلید ها جستجو میکند. اگر میخواهیم این جستجو بر روی مقادیر باشد باید از متد ContainsValue استفاده کنیم:
System.out.println(zerotohero.containsValue("vhdrjb")); /// output : true System.out.println(zerotohero.containsValue("vahid")); /// output : false
میتوانیم با استفاده از دستور KeySet, تمام کلید ها را به صورت یک لیست دریافت کنیم:
for (String key : zerotohero.keySet()) { System.out.println(key); }
و همچنین لیست مقادیر را میتوانیم با استفاده از متد values دریافت کنیم:
for (String s : zerotohero.values()) { System.out.println(s); }
اگر بخواهیم یک کلید و مقدار آن را از کلاس حذف کنیم, از دستور Remove استفاده میکنیم. برای استفاده از این متد کلید مورد نظر را به عنوان یک متغیر به آن ارسال میکنیم. حالت دیگری از این متد وجود دارد که دو متغیر را دریافت میکند. در این حالت متغیر اول به عنوان کلید و متغیر دوم به عنوان مقدار کلید است. حال اگر مقدار مشخص شده به کلید اختصاص نیافته باشد, عمل حذف انجام نمیشود. در حقیقت این روش برای زمانی است که میخواهیم یک حالت خاص را از کلاس حذف کنیم. اما در روشی که تنها نام کلید را مشخص میکنیم, مقدار کلید از کلاس حذف میگردد:
zerotohero.remove("email", "vahid"); /// email vahid not exists System.out.println(zerotohero.get("email")); // output : email value : vhdrjb@myMail.com zerotohero.remove("email"); System.out.println(zerotohero.get("email")); // output : Null
اکنون میخواهیم مقدار یک کلید را تغییر دهیم اما نمیخواهم مقدار قبلی از دست برود. برای این منظور از متد Replace استفاده میشود. با استفاده از این متد, مقدار جدید را برای کلید مشخص میکنیم و مقدار قبلی توسط متد برگردانده میشود:
String replaceResult = zerotohero.replace("username", "new username"); System.out.println(replaceResult); // Output : vhdrjb System.out.println(zerotohero.get("username")); // Output : new username
گاهی نیاز است تا حتما یک مقدار مشخص اختصاص یافته به کلید تغییر کند. به این ترتیب از متد Replace با سه متغیر استفاده میکنیم. وقتی از این حالت متد Replace استفاده کنیم, مقداری که متد برمیگرداند از نوع Boolean است. متغیر اول به عنوان کلید, متغیر دوم به عنوان مقدار قدیم و متغیر سوم به عنوان مقدار جدید به متد ارسال میشود. حال اگر مقدار قدیم به کلید اختصاص نیافته باشد, این جابجایی مقدار انجام نمیشود و مقداری که برمیگرداند false است. اما اگر مقدار به کلید اختصاص یافته باشد, مقدار true را بر میگرداند:
boolean result1 = zerotohero.replace("password", "2222", "4321"); System.out.println(result1); /// output : false System.out.println(zerotohero.get("password")); /// output : 1234 boolean result2 = zerotohero.replace("password", "1234", "4321"); System.out.println(result2); /// output : true System.out.println(zerotohero.get("password")); /// output : 4321
ممکن است نیاز باشد تا یک مقدار به عنوان مقدار پیش فرض برای کلید تعیین گردد. برای مثال فرض کنید یه مقدار به کلید اختصاص نیافته است و اگر مقدار Null به آن اختصاص یابد, برنامه دچار مشکل میشود. به این ترتیب از متد getOrDefault استفاده میشود:
zerotohero.remove("username"); String result = zerotohero.getOrDefault("username", "username not found"); System.out.println(result); /// output : username not found
در بعضی موارد نیاز است تا پردازشی بر روی مقدار کلید انجام شود که مقدار کلید در آن پردازش نقش دارد. برای این منظور از متد compute استفاده میشود:
zerotohero.compute("password", (key, value) -> key + " = " + value); System.out.println(zerotohero.get("password")); /// password = 1234
متد computeIfAbsent برای نیز مانند متد فوق است با این تفاوت که اگر به کلید مقداری اختصاص نیافته باشد, پردازش را انجام میدهد. متد ComputeIfPresent نیز مانند متد compute است اما تنها در شرایطی پردازش را انجام میدهد که مقداری به کلید اختصاص یافته باشد. در واقع ممکن است در پردازش با compute, مقداری به کلید اختصاص نیافته باشد اما برای استفاده از computeIfPresent, کلید حتما باید دارای مقدار باشد.
در این مقاله سعی بر این شد تا با کلاس HashMap آشنا شویم و متد های آن را در قالب مثال های کوتاهی مورد بررسی قرار دهیم. این کلاسی یکی از کلاس های بسیار پرکاربرد است و استفاده درست از متد های آن, میتواند بهینگی در پردازش های برنامه را به همراه داشته باشد.
با ما همراه باشید.
مطالب زیر را حتما مطالعه کنید
از Java به Dart – کلاس و Constructor
آموزش Gradle – اهمیت Project Automation
تفاوت Sequence و List در کاتلین
بهترین محیط های توسعه(IDE) برای جاوا
Open/Closed Principle در قوانین Solid
توابع در زبان برنامه نویسی Kotlin
3 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام ممنون از شما از مطالبتون با ذکر منبع استفاده و کپی کردم.
سلام و تشکر از مقاله های بسیار خوب و کاربردی که در سایت قرار دادید
در hashmap قسمت دریافت اطلاعات با متد Get اشتباها کدهای متد Contains رو قرار دادید.
سلام دوست عزیز. ممنون از توجه شما. اصلاح شد.