ใน Java อะไรคือความแตกต่างระหว่าง IdentityHashMap และ HashMap + การเปรียบเทียบประสิทธิภาพ

เผยแพร่แล้ว: 2021-10-19
ความแตกต่างระหว่างข้อมูลประจำตัวhashmap-and-hashmap-performance-comparison

บางครั้งฉันมีกรณีพิเศษที่ฉันต้องเปรียบเทียบคีย์ของแผนที่ตาม equality operator (==) ตัวดำเนินการความเท่าเทียมกัน (==) จะเปรียบเทียบการอ้างอิง (ที่อยู่ในหน่วยความจำ) ของคีย์ทั้งสองเป็นตัวเลขที่แตกต่างกันสองหมายเลข

ในทางกลับกัน HashMap เป็นองค์ประกอบ Java Collection Framework ที่ใช้มากที่สุด ซึ่งเปรียบเทียบความเป็นเอกลักษณ์ของคีย์ด้วยความช่วยเหลือของวิธี equals()

นอกจากนี้ IdentityHashMap ไม่ได้ใช้แฮชจาก object.hashCode() แต่ใช้ System.identityHashCode(object) เราสามารถใช้ IdentityHashMap สำหรับอ็อบเจ็กต์ที่เปลี่ยนแปลงได้ซึ่งโค้ดแฮชเปลี่ยนระหว่างรันไทม์

หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ equals() และ == ซึ่งใช้ on String Object ให้ทำตามบทช่วยสอนนี้: https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/

การทดสอบพื้นฐานซึ่งแสดงให้เห็นข้างต้นเท่ากับ () และ == พฤติกรรม:

ผลลัพธ์:

มาทำการทดสอบประสิทธิภาพบนทั้งสองแผนที่กัน:

  1. สร้างคลาส Java: CrunchifyIdentityHashMapVsHashMapPerformance .java
  2. startCrunchifyTest()
    • สร้างขนาดแผนที่สุ่มเป็นล้าน
    • สร้างอินสแตนซ์และเริ่มต้น crunchifyString[] วัตถุสตริงอาร์เรย์ด้วยหมายเลขสุ่มที่สร้างด้านบนพร้อมข้อความ: This is Crunchify's Test # number
  3. crunchifyCompareIdentityHashMapVsHashMap(String[] crunchifyString , Map<String, Integer> crunchifyMap , String name )
    • ส่งพารามิเตอร์ที่จำเป็นทั้งหมดไปยังวิธีนี้
    • crunchifyMap จะมีค่า IdentityHashMap / HashMap
    • ทำซ้ำผ่าน crunchifyString[] และใส่ค่าลงใน Map — การดำเนินการนี้ใช้เวลาพอสมควร
    • ทำซ้ำผ่าน crunchifyString[] และรับค่าจาก Map — การดำเนินการนี้ใช้เวลาพอสมควร
    • เราจะหาเวลาดำเนินการสำหรับการดำเนินการทั้งสองข้างต้นเพื่อเปรียบเทียบว่าอันไหนดีกว่าสำหรับการดำเนินการข้างต้น IdentityHashMap หรือ HashMap
    • พิมพ์ด้านบนผล
  4. ดำเนินการข้างต้นงาน 2 และ 3 รวม 8 ครั้ง

ผลลัพธ์:

การสังเกต:

ดังที่คุณเห็นในผลลัพธ์นี้ สำหรับแผนที่ขนาดใหญ่ IdentityHashMap จะทำงานได้ดีกว่ามาก ทำไม? IdentityHashMap doesn't use equals() and hashcode() methods ซึ่งถือว่ามีค่าใช้จ่ายสูง

เพียงแค่ FYI:

การดำเนินการข้างต้นที่เราทำเพื่อใส่และรับค่าจากและลงใน Map นั้นใช้ CPU มาก

การทดสอบ IdentityHashMap กับ HashMap - การใช้งาน CPU