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

การทำงานภายในของ HashMap ใน Java


ฟังก์ชัน 'hashCode' ใช้เพื่อรับรหัสแฮชของวัตถุใน Java นี่คืออ็อบเจ็กต์ของ super class Object ส่งคืนหน่วยความจำอ้างอิงวัตถุเป็นจำนวนเต็ม เป็นฟังก์ชันแบบเนทีฟ ซึ่งหมายความว่าไม่สามารถใช้เมธอดโดยตรงใน Java เพื่อดึงข้อมูลอ้างอิงของอ็อบเจ็กต์ได้

เพื่อประสิทธิภาพที่ดีขึ้นของ HashMap ให้ใช้ hashCode() อย่างถูกต้อง โดยทั่วไป ฟังก์ชันนี้จะใช้ในการคำนวณค่าที่ฝากข้อมูลและดัชนี กำหนดไว้ดังนี้ −

public native hashCode()

เนื่องจากเราได้กล่าวถึง 'ถัง' สิ่งสำคัญคือต้องเข้าใจว่ามันหมายถึงอะไร เป็นองค์ประกอบที่ใช้เก็บโหนด สามารถมีได้มากกว่าหนึ่งโหนดในที่ฝากข้อมูลเดียว โหนดสามารถเชื่อมต่อได้โดยใช้โครงสร้างข้อมูลรายการที่เชื่อมโยง ความจุของแฮชแมปสามารถคำนวณได้โดยใช้บัคเก็ตและตัวประกอบการโหลด

Capacity = number of buckets * load factor

ฟังก์ชัน 'เท่ากับ' ใช้เพื่อตรวจสอบความเท่าเทียมกันระหว่างสองวัตถุ มันยังได้รับจาก super class Object ฟังก์ชันนี้สามารถแทนที่ได้ในคลาสที่กำหนดเองโดยจัดเตรียมการใช้งานที่กำหนดเอง ฟังก์ชันนี้จะคืนค่าเป็นจริงหรือเท็จขึ้นอยู่กับว่าวัตถุทั้งสองในคำถามมีค่าเท่ากันหรือไม่

ค่าดัชนีถูกสร้างขึ้นเพื่อให้ขนาดของอาร์เรย์ไม่ใหญ่ ดังนั้นจึงหลีกเลี่ยง outOfMemoryException สูตรการหาดัชนีของอาร์เรย์คือ −

Index = hashCode(key) & (n-1) – Here n refers to number of buckets.

เรามาดูตัวอย่างกัน −

ตัวอย่าง

import java.util.HashMap;
class hash_map{
   String key;
   hash_map(String key){
      this.key = key;
   }
   @Override
   public int hashCode(){
      int hash = (int)key.charAt(0);
      System.out.println("The hash code for key : " + key + " = " + hash);
      return hash;
   }
   @Override
   public boolean equals(Object obj){
      return key.equals(((hash_map)obj).key);
   }
}
public class Demo{
   public static void main(String[] args){
      HashMap my_map = new HashMap();
      my_map.put(new hash_map("This"), 15);
      my_map.put(new hash_map("is"), 35);
      my_map.put(new hash_map("a"), 26);
      my_map.put(new hash_map("sample"), 45);
      System.out.println("The value for key 'this' is : " + my_map.get(new hash_map("This")));
      System.out.println("The value for key 'is' is: " + my_map.get(new hash_map("is")));
      System.out.println("The value for key 'a' is: " + my_map.get(new hash_map("a")));
      System.out.println("The value for key 'sample' is: " + my_map.get(new hash_map("sample")));
   }
}

ผลลัพธ์

The hash code for key : This = 84
The hash code for key : is = 105
The hash code for key : a = 97
The hash code for key : sample = 115
The hash code for key : This = 84
The value for key 'this' is : 15
The hash code for key : is = 105
The value for key 'is' is: 35
The hash code for key : a = 97
The value for key 'a' is: 26
The hash code for key : sample = 115
The value for key 'sample' is: 45

คลาสชื่อ 'hash_map' กำหนดสตริงและตัวสร้าง สิ่งนี้ถูกแทนที่โดยฟังก์ชันอื่นที่ชื่อว่า 'hashCode' ที่นี่ ค่าคีย์ของ hashmap จะถูกแปลงเป็นจำนวนเต็มและพิมพ์รหัสแฮช ถัดไป ฟังก์ชัน 'เท่ากับ' จะถูกแทนที่และตรวจสอบว่าคีย์นั้นเท่ากับคีย์ของแฮชแมปหรือไม่ คลาสสาธิตกำหนดฟังก์ชันหลักที่สร้างอินสแตนซ์ใหม่ของ HashMap องค์ประกอบถูกเพิ่มเข้าไปในโครงสร้างนี้โดยใช้ฟังก์ชัน 'put' และพิมพ์บนคอนโซล