Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความแตกต่างระหว่าง HashMap และ ConcurrentHashMap


ดังที่เราทราบใน Java Collections เป็นหนึ่งในโครงสร้างข้อมูลที่สำคัญที่สุดในการเก็บข้อมูล มีการใช้งานหลายอย่างในคอลเล็กชัน เช่น แผนที่ รายการการตั้งค่า เป็นต้น ซึ่งทำให้คุ้มค่าที่สุดสำหรับการจัดเก็บข้อมูลและจัดการตามความเหมาะสม เนื่องจากการใช้งานเหล่านี้ไม่เพียงแต่ทำให้การจัดเก็บข้อมูลมีประสิทธิภาพ แต่ยังช่วยให้การจัดการข้อมูลในสภาพแวดล้อมแบบมัลติเธรดด้วย

ในบรรดาการใช้งานอื่น ๆ ของคอลเลกชัน Hash Map เป็นหนึ่งในคอลเล็กชันที่สำคัญซึ่งจัดเก็บข้อมูลในคู่ของ Key Value ในบริบทของการทำ multi-threading มีการนำคอลเลกชันที่เรียกว่า Concurrent Collection มาใช้ ซึ่งควบคู่ไปกับคุณสมบัติของ Hash map ยังช่วยให้สามารถจัดการข้อมูลในสภาพแวดล้อมแบบมัลติเธรดได้

บนพื้นฐานของการใช้งานภายในของคอลเล็กชันทั้งสองนี้ ต่อไปนี้คือความแตกต่างที่สำคัญ

ซีเนียร์ เลขที่ คีย์ HashMap ConcurrentHashMap
1 การทำงานพร้อมกัน ดังที่กล่าวไว้ข้างต้น ความแตกต่างหลักระหว่างทั้งสองคอลเลกชันนี้คือ HashMap ที่ทำงานพร้อมกันไม่ปลอดภัยสำหรับเธรด ในทางกลับกัน ConcurrentHashMap นั้นปลอดภัยสำหรับเธรดและเหมาะสำหรับใช้ในสภาพแวดล้อมแบบมัลติเธรด
2 การนำไปใช้ Hashmap และ ConcurrentHashmap มีการใช้งานต่างกันภายในเนื่องจาก Hashmap ไม่มีแนวคิดหากกลุ่มในกลไกการจัดเก็บและจัดเก็บข้อมูลในคู่ของ Key Value ในอีกทางหนึ่งการนำ Concurerent HashMap ไปใช้ในลักษณะที่ HashMap พร้อมกันถูกแบ่งออกเป็นจำนวนเซ็กเมนต์ [ค่าเริ่มต้น 16] ในการเริ่มต้น ConcurrentHashMap อนุญาตให้จำนวนเธรด (16) ที่คล้ายกันเข้าถึงเซ็กเมนต์เหล่านี้พร้อมกัน เพื่อให้แต่ละเธรดทำงานบนเซ็กเมนต์เฉพาะในระหว่างที่มีการทำงานพร้อมกันสูง
3 แนะนำ HashMap ถูกนำมาใช้ใน JDK 1.2 ในทางกลับกัน ConcurrentHashMap ได้รับการแนะนำโดย SUN Microsystem ใน JDK 1.5
4 Null allow ดังที่กล่าวไว้ข้างต้นค่า null ได้รับอนุญาตสำหรับคีย์และค่าในกรณีของ HashMap ในทางกลับกัน ค่า Null ของ Concurrent HashMap ไม่อนุญาตทั้งสำหรับคีย์และค่า และหากพยายามสำหรับรายการดังกล่าว จะได้รับข้อยกเว้นรันไทม์โดยบอกว่า NullPointerException
5 การซิงโครไนซ์ HashMap ดีกว่า HashMap พร้อมกัน เนื่องจากไม่มีการซิงโครไนซ์ ในทางกลับกัน ConcurrentHashMap ความปลอดภัยของเธรดทำได้โดยการแบ่งแผนที่ทั้งหมดออกเป็นพาร์ติชั่นต่างๆ ตามระดับการทำงานพร้อมกัน และล็อกเฉพาะบางส่วนเท่านั้นแทนที่จะล็อกทั้งแผนที่
6 ประสิทธิภาพ เราสามารถซิงโครไนซ์ Hashmap ได้โดยใส่ไว้ใน Collections.synchornizedMap(HashMap) ซึ่งจะส่งคืนคอลเล็กชันซึ่งเกือบจะเทียบเท่ากับ Hashtable ซึ่งการดำเนินการแก้ไขทุกอย่างบนแผนที่จะถูกล็อกไว้ที่วัตถุแผนที่ ดังที่กล่าวไว้ข้างต้นว่าจำเป็นต้องใช้เมธอด Collections.SynchronizedMap() ดังนั้น ConcurrentHashMap() จึงเป็นตัวเลือกที่ดีกว่า เนื่องจาก ConcurrentHashMap ยังคงให้โอกาสมากกว่าหนึ่งเธรดในการเข้าถึงแผนที่ซึ่งจะช่วยปรับปรุงประสิทธิภาพ