คำถามและคำตอบสัมภาษณ์ Hashmap [สำหรับผู้เริ่มต้นและผู้มีประสบการณ์]
เผยแพร่แล้ว: 2020-09-24คลาสของ java.util.HashMap เป็นหนึ่งในไลบรารี่ที่สำคัญที่สุดของ Java ไม่ค่อยมีโครงการใดที่เขียนด้วย java และไม่ได้ใช้ไลบรารีของ HashMap ในการใช้งาน เป็นวิธีที่ใช้โครงสร้างข้อมูลนี้ ซึ่งทำให้แทบขาดไม่ได้สำหรับโปรแกรมที่เกี่ยวข้องกับ Java ในคำจำกัดความของ HashMap นั้นง่ายมาก HashMap เป็นโครงสร้างข้อมูลที่ดำเนินการโดยใช้วิธีการแบบตาราง
มีการกล่าวอย่างถูกต้องว่าหากมีโครงสร้างข้อมูลเพียงโครงสร้างเดียวก็ควรเป็น HashMap สิ่งนี้ไม่เพียงแค่มีประโยชน์อย่างมากเท่านั้น แต่ยังมีประสิทธิภาพด้านเวลาอย่างมากอีกด้วย การค้นหาอย่างง่ายใน HashMap ใช้เวลาประมาณ O (1) เท่านั้น (หมายถึงการค้นหาทั้งหมดใน HashMap จะทำในเวลาคงที่) คุณจะพบการใช้งาน HashMap มากมายในภาษาการเขียนโปรแกรมของ Java เช่น HashTable, concurrenthashmaps เป็นต้น อย่างไรก็ตาม หากคุณกำลังมองหาการใช้งานทั่วไป คุณไม่ควรหลงทางจาก HashMap พื้นฐาน
การใช้งาน HashMap แต่ละรายการเหล่านี้มาพร้อมกับชุดคุณสมบัติและกรณีการใช้งานของตัวเอง หากคุณต้องการรักษาลำดับที่คุณเขียนการแมปไว้ คุณควรใช้ HashMap ที่เชื่อมโยง หากคุณต้องการจัดเรียงแผนที่ของคุณ คุณควรใช้การนำ HashMap ไปใช้งาน TreeMap ซึ่งจะทำการเรียงลำดับให้คุณ
ในทำนองเดียวกัน หากคุณกำลังมองหาตาราง Hash ที่ปลอดภัยสำหรับเธรด ซึ่งสามารถใช้ในแอปพลิเคชันที่ทำงานพร้อมกันโดยที่ยังคงความสามารถในการปรับขนาดได้ คุณจะต้องดู HashMap ที่ทำงานพร้อมกัน
อย่างที่คุณเห็น มีหลายวิธีที่คุณสามารถใช้ HashMap หากต้องการทราบถึงความสำคัญของ HashMap จริงๆ คุณควรเห็นคำถามสัมภาษณ์สำหรับโปรไฟล์งานด้านวิศวกรรมซอฟต์แวร์ คุณจะไม่สามารถปรับเวลาให้เหมาะสมได้อย่างเหมาะสม หากคุณไม่ทราบวิธีการใช้ HashMap อย่างถูกต้อง ดังนั้น หากคุณเป็นโปรแกรมเมอร์ คุณไม่สามารถหลีกเลี่ยงการเรียนรู้รายละเอียดเกี่ยวกับ HashMap ได้ ดังนั้นเราจึงได้ระบุคำถามสัมภาษณ์ hashmap ที่โดดเด่นไว้ด้านล่าง ซึ่งจะช่วยให้คุณสามารถเตรียมตัวสำหรับการสัมภาษณ์ครั้งต่อไปได้
เรียนรู้ หลักสูตรวิทยาศาสตร์ข้อมูลออนไลน์ จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม PG สำหรับผู้บริหาร โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโท เพื่อติดตามอาชีพของคุณอย่างรวดเร็ว
สารบัญ
คำถามและคำตอบสัมภาษณ์ Hashmap
ไตรมาสที่ 1 คุณจะใช้เมธอด put() ของ HashMap ใน Java อย่างไร
ตอบ วิธีการของ put() ทำงานโดยใช้หลักการที่เรียกว่า hash คุณจะใช้ฟังก์ชันนี้เพื่อเก็บอ็อบเจ็กต์ที่เป็นปัญหาไว้ในแบ็กเอนด์ (ซึ่งเป็นอาร์เรย์ของหน่วยความจำ) คุณจะต้องใช้ฟังก์ชันอื่นร่วมกับฟังก์ชัน put() เพื่อให้ทราบตำแหน่งที่แน่นอนของวัตถุนี้ในแบ็กเอนด์ ฟังก์ชัน hashcode() ถูกใช้เป็นฟังก์ชันตัวช่วยเพื่อใส่ () ในลักษณะที่เราได้อธิบายไว้ก่อนหน้านี้
ดังนั้น วิธีที่ทั้งสองฟังก์ชันทำงานร่วมกันคือพวกเขาไปค้นหาคีย์ที่มีอยู่และตำแหน่งหน่วยความจำในแบ็กเอนด์ หากเกิดการชนกัน วัตถุที่มีทั้งสองค่า (หมายถึงค่าของทั้งคีย์และค่า) จะถูกเพิ่มลงในการใช้งานแบบไดนามิกของรายการ หรือที่เรียกว่ารายการที่เชื่อมโยง รายการที่ชอบที่นี่ถูกเก็บไว้ในตำแหน่งหน่วยความจำซึ่งพบก่อนหน้านี้
ไตรมาสที่ 2 อะไรคือความต้องการพื้นฐานที่อ็อบเจ็กต์ต้องมีเพื่อที่จะใช้เป็นคีย์หรือค่าของ HashMap
ตอบ ทั้งคีย์และค่าที่เราใช้ใน HashMap และการใช้งานควรมีสองฟังก์ชันนี้เขียนไว้ด้วย ชื่อของฟังก์ชันทั้งสองนี้คือ equals() และ hashcode() ฟังก์ชั่นที่มีชื่อของ hashcode() ถูกใช้เมื่อเราแทรกค่าของคีย์ใน HashMap ใดๆ ในเวลาเดียวกัน ฟังก์ชันของ equals() จะถูกเรียกเฉพาะเมื่อเราพยายามดึงค่าที่เก็บไว้ใน HashMap กลับคืนมาเท่านั้น
ไตรมาสที่ 3 ให้เราบอกว่าคุณลืมคีย์ที่คุณใช้ไปแล้วใน HashMap ของคุณ คีย์ถัดไปที่คุณต้องการเพิ่มมีอยู่แล้วใน HashMap คุณคิดว่าจะเกิดอะไรขึ้นในกรณีนี้?
ตอบ หากคุณรู้สึกว่าควรมีข้อผิดพลาด คุณจะไม่ผิดหากเราไม่ได้พูดถึง HashMap อย่างไรก็ตาม หากคุณใช้ HashMap และบังเอิญแทรกคีย์ที่มีค่าอยู่ใน hashmap แล้ว คอมไพเลอร์ Java จะไม่แสดงข้อผิดพลาดใดๆ สิ่งที่จะเกิดขึ้นคือคอมไพเลอร์จะไปค้นหาค่าที่เกี่ยวข้องกับคีย์ที่คุณป้อน และจะอัปเดตเฉพาะค่าที่นั่นเท่านั้น
หากคุณใช้ฟังก์ชัน put() เพื่อเพิ่มค่าลงใน hashmap ค่าที่ส่งคืนของฟังก์ชันนี้จะเป็นค่าเก่าที่เชื่อมโยงกับคีย์นั้น สมมุติว่าสำหรับคีย์ A คุณมีค่าที่เก็บไว้เป็น 1 หากตอนนี้คุณใส่ค่าของ A ให้เป็น ให้เราบอกว่า 50 แล้วค่าที่ฟังก์ชัน put() จะส่งกลับจะเป็น 1 และค่าสุดท้ายที่เก็บไว้ในคีย์ A จะเป็น 50
ไตรมาสที่ 4 ในกรณีที่จำเป็นต้องเก็บค่าว่างไว้ คุณจะสามารถใช้ HashMap ในกรณีนั้นได้หรือไม่?
ตอบ ใช่ เราจะสามารถใช้ hashmap ได้ในกรณีนั้นโดยไม่มีปัญหาใดๆ เนื่องจาก hashmaps จะไม่ลดค่าที่คุณสามารถจัดเก็บได้ คุณสามารถจัดเก็บค่า Null ได้มากเท่าที่คุณต้องการใน hashmap ใดๆ
Q5. มีการจัดการการชนกันของการนำ hashmap ไปใช้ใน Java อย่างไร?
ตอบ ไลบรารีโค้ดของ java.util.HashMap ใช้วิธีการผูกมัดเพื่อจัดการกับการชนกัน วิธีการทำงานของ chaining นี้คือรายการใหม่ใดๆ ใน hashmap ที่มีทั้งคู่คีย์และค่าจะถูกจัดเก็บไว้ในรายการที่เชื่อมโยง จากนั้นรายการนี้จะถูกจัดเก็บในตำแหน่งที่มีข้อมูลที่มีอยู่ของ hashmaps (ตำแหน่งที่ฝากข้อมูล) .
ในกรณีที่คีย์ทั้งหมดที่คุณมีใน hashmap ของคุณกลายเป็น hashcode เดียวกัน ดังนั้น hashmap ของคุณจะไม่เป็น hashmap อีกต่อไป มันจะกลายเป็นรายการที่เชื่อมโยง เวลาค้นหาจะเพิ่มขึ้นสำหรับลำดับของหนึ่ง (o(1)) เช่น เวลาคงที่ ลำดับของ N (O(N)) ซึ่งเป็นเวลาเชิงเส้น
Q6. คุณจะสามารถเก็บคีย์ที่มีค่า null ในการใช้งาน hashmap ของ java ได้หรือไม่?
ตอบ ได้ ในการใช้งาน hashmap ของ java คุณจะสามารถเก็บคีย์ที่มีค่าว่างได้ แต่คุณจะสามารถเก็บคีย์ดังกล่าวได้เพียงคีย์เดียวเท่านั้น ซึ่งจะถูกเก็บไว้ที่จุดเริ่มต้นของรายการฝากข้อมูลเสมอ hashmap จะไม่เรียกใช้ฟังก์ชัน hashcode() ที่นี่ เพราะหากใช้ฟังก์ชันนั้นกับคีย์ null ก็จะส่งข้อผิดพลาด Null Pointer Exception คุณจะต้องใช้ฟังก์ชัน get แทนการใช้ค่า null เป็นคีย์ ถ้าคุณต้องการให้ดัชนีแรกของ hashmap ถูกส่งกลับหาคุณ

อ่าน: การเรียงลำดับในโครงสร้างข้อมูล: หมวดหมู่ & ประเภท
Q7. โครงสร้างข้อมูลใดที่คุณคิดว่า hashmap ออกแบบมาเพื่อเลียนแบบ
ตอบ แฮชแมปควรจะเลียนแบบรูปลักษณ์และการทำงานของโครงสร้างข้อมูลตารางแฮช โครงสร้างข้อมูลตารางแฮชเป็นตัวเลือกในอุดมคติของคุณ หากคุณต้องการจัดเก็บค่าในรูปแบบของคู่คีย์และค่า เหตุผลหลักว่าทำไมจึงนิยมใช้ตารางแฮชนี้เนื่องจากเวลาในการค้นหา ดังนั้น หากคุณมีคีย์ที่ต้องการค้นหา คุณก็จะได้ค่าที่ต้องการกลับมาในลำดับของเวลาหนึ่งหรือคงที่ตามลำดับเวลา
Q8. เนื่องจาก hashmap ไม่ใช่หนึ่งในโครงสร้างข้อมูลหลักเช่นโครงสร้างหรืออาร์เรย์ คุณคิดว่าจะเกิดอะไรขึ้นภายใต้ประทุนทุกครั้งที่คุณสร้าง hashmap? คุณคิดว่าการรวมกันของโครงสร้างข้อมูลใดที่ทำให้แฮชแมปแก่เรา
ตอบ แม้ว่า hashmap จะแสดงถึง hashtable จริง ๆ แต่ภายใต้ประทุน มันไม่ได้ถูกนำไปใช้โดยตรง เราใช้โครงสร้างข้อมูลที่รู้จักกันดีสองโครงสร้างสำหรับการหายใจเข้าสู่ hashmap เราใช้รายการที่เชื่อมโยงและอาร์เรย์ รายการที่เชื่อมโยงใช้เพื่อจัดเก็บคู่คีย์และค่าแบบไดนามิก และอาร์เรย์จะใช้เพื่อจัดเก็บรายการที่เชื่อมโยงเหล่านี้ทั้งหมดลงในรายการ ร่วมกันสร้าง hashmap
จาก Java 8 หากรายการลิงก์มีขนาดใหญ่เพียงพอ Java จะใช้แผนผังการค้นหาแบบไบนารีแทนรายการลิงก์ การเปลี่ยนแปลงนี้ทำขึ้นเพื่อประหยัดเวลาและปรับปรุงประสิทธิภาพโดยรวมของแฮชแมป
อ่านเพิ่มเติม: คำถามสัมภาษณ์วิทยาศาสตร์ข้อมูล
Q9. ในกรณีที่เราต้องการจัดเก็บค่าหลายค่าภายใต้คีย์เดียวกัน คุณคิดว่าจะเป็นไปได้ในการติดตั้ง hashmap ใน Java หรือไม่?
ตอบ ไม่ คุณจะไม่สามารถจัดเก็บคีย์ที่ซ้ำกันในแฮชแมปได้ หากคุณพยายามเก็บค่าใหม่ในคีย์ที่มีอยู่แล้วใน hashmap แล้ว hashmap จะลบค่าที่จัดเก็บไว้ในคีย์นั้นก่อนหน้านี้และแทนที่ด้วยค่าใหม่
ขนาดของ hashmap ในกรณีนี้ จะไม่เปลี่ยนแปลง หมายความว่าจะไม่มีการเพิ่มเติมคีย์ลงใน hashmap คุณลักษณะนี้เป็นหนึ่งในเหตุผลที่เราใช้ฟังก์ชัน keyset() เพื่อรับคีย์ทั้งหมดของ hashmap และฟังก์ชันนี้จะคืนค่าชุดและไม่ใช่คอลเลกชัน (เพราะในชุดค่าทั้งหมดจะต้องไม่ซ้ำกัน)
Q10. คุณจะสามารถเก็บค่าที่ซ้ำกันใน HashMap ได้หรือไม่?
ตอบ ได้ คุณจะสามารถเก็บค่าที่ซ้ำกันใน hashmap ได้ นั่นคือเหตุผลที่เมื่อคุณดึงค่าทั้งหมดจาก hashmap จากนั้นแทนที่จะได้ชุด เราก็ได้ชุดสะสม ไม่ให้ค่าในรูปของรายการเพราะไม่รับประกันการสั่งซื้อ
Q11. ในการใช้งาน hashmap ของ Java นั้นปลอดภัยสำหรับเธรดหรือไม่
ตอบ ไม่ vanilla Hashmap นั้นไม่ปลอดภัยสำหรับเธรดใน Java ตามหลักการแล้ว คุณควรหลีกเลี่ยงการแชร์ hashmap กับเธรดที่สามารถเปลี่ยนค่าและแก้ไข hashmap ในรูปแบบหรือรูปร่างใดๆ อย่างไรก็ตาม คุณสามารถใช้แฮชแมปแบบอ่านอย่างเดียวแล้วป้อนลงในเธรดได้ ด้วยวิธีนี้ ค่าที่อยู่ในนั้นจะไม่เปลี่ยนแปลง
คำถามที่ 12 คุณคิดว่าจะเกิดอะไรขึ้นถ้าเราใช้ hashmap ในแอปพลิเคชันที่ใช้หลายเธรด
ตอบ หากคุณบังเอิญส่ง hashmap ไปยังแอปพลิเคชันที่ใช้มากกว่าหนึ่งเธรด และแต่ละเธรดเหล่านี้สามารถแก้ไข เพิ่ม หรือลบค่าที่จัดเก็บไว้ใน hashmap ได้ ข้อมูลภายในที่ใช้สร้าง hashmap จะเสียหาย . ลิงก์ที่ใช้สร้าง hashmap จะหายไป จากนั้น hashmap จะสูญเสียโครงสร้าง และจุดประสงค์ของมันก็จะหายไปด้วย ดังนั้น ขอแนะนำเสมอว่า คุณใช้ thread safe hashmap เสมอ หากคุณต้องการใช้ในแอปพลิเคชันที่เป็นเธรด
Q13. หากเราต้องการวนซ้ำ HashMap ทั้งหมดใน Java มีวิธีใดบ้างที่เราจะสามารถทำได้?
ตอบ มีหลายวิธีที่คุณสามารถทำซ้ำบน hashmap ใน java; บางส่วนของพวกเขามีการระบุไว้ด้านล่าง:
- คุณสามารถใช้ฟังก์ชัน keySet ร่วมกับตัวแปรการวนซ้ำ
- คุณสามารถใช้ฟังก์ชัน enterySet ร่วมกับตัวแปรการวนซ้ำ
- คุณสามารถใช้ฟังก์ชัน entrySet และใช้กับลูปที่ปรับปรุงแล้ว
- คุณสามารถใช้ keySet และรับเมธอด
อ่านเพิ่มเติม: โครงสร้างข้อมูล & อัลกอริธึมใน Python: ทุกสิ่งที่คุณต้องรู้
อะไรต่อไป?
หากคุณอยากเรียนรู้เกี่ยวกับวิทยาศาสตร์ข้อมูล ลองดูโปรแกรม Executive PG ของ IIIT-B & upGrad ใน Data Science ซึ่งสร้างขึ้นสำหรับมืออาชีพที่ทำงานและมีกรณีศึกษาและโครงการมากกว่า 10 รายการ เวิร์กช็อปภาคปฏิบัติจริง การให้คำปรึกษากับผู้เชี่ยวชาญในอุตสาหกรรม 1 -on-1 พร้อมที่ปรึกษาในอุตสาหกรรม การเรียนรู้มากกว่า 400 ชั่วโมงและความช่วยเหลือด้านงานกับบริษัทชั้นนำ
Hashtable แตกต่างจาก HashMap อย่างไร
โครงสร้างข้อมูลที่ไม่ซิงโครไนซ์คือ HashMap ในทางกลับกัน Hashtable นั้นปลอดภัยสำหรับเธรดและอาจแชร์ข้ามเธรดจำนวนมากโดยไม่ต้องใช้รหัสการซิงโครไนซ์ Hashtable ไม่อนุญาตให้มีคีย์ null หนึ่งคีย์หรือค่า null หลายค่า แต่ HashMap อนุญาต ควรใช้ HashMap แทน Hashtable ในแอปพลิเคชันที่ไม่ใช่เธรด กล่าวง่ายๆ ว่า HashMap ควรใช้ในแอปพลิเคชันแบบเธรดเดียวหรือไม่ซิงโครไนซ์
การใช้ HashMap หรือ TreeMap เร็วกว่าหรือไม่?
ใน TreeMap ค่าจะถูกกำหนดโดยคีย์ ไม่สามารถมีคีย์ null ได้ แต่สามารถมีค่า Null ได้หลายค่า มันเหมือนกับ HashMap ยกเว้นว่าจะเรียงลำดับจากน้อยไปมาก แต่ยังคงเรียงลำดับจากน้อยไปมาก (จัดเรียงโดยใช้ลำดับตามธรรมชาติของคีย์) HashMap ใช้โครงสร้างข้อมูลแบบอาร์เรย์เพื่อจัดระเบียบส่วนประกอบตามฟังก์ชันแฮชในรูปแบบการใช้งานแบบแฮชเทเบิล สำหรับการดำเนินการส่วนใหญ่ เช่น add(), delete() และประกอบด้วย HashMap จะคาดการณ์ประสิทธิภาพการทำงานตามเวลาคงที่ของ O(1) () ส่งผลให้เร็วกว่า TreeMap มาก
เมื่อใดควรใช้ HashMap แทน ArrayList
เฉพาะเมื่อมีคีย์เฉพาะสำหรับข้อมูลที่เราต้องการจะจัดเก็บ HashMap ก็สมเหตุสมผล เมื่อมองหาสิ่งต่าง ๆ ตามคีย์ เราควรใช้มันเนื่องจากต้องใช้เวลาในการเข้าถึงอย่างรวดเร็ว เมื่อการรักษาลำดับรายการเดียวกันในคอลเลกชันเป็นสิ่งสำคัญ เราควรหลีกเลี่ยง HashMap ทั้งสองต่างกันและมีจุดประสงค์ที่แตกต่างกัน หากคุณต้องการเก็บอ็อบเจ็กต์ใน Java ให้ใช้ HashMap เพื่อจับคู่คีย์กับค่าและ ArrayList มิฉะนั้น