มันจะเป็นคำตอบที่ยาวคว้าเครื่องดื่มและอ่านต่อ ...
การแปลงข้อมูลเป็นข้อมูลเกี่ยวกับการจัดเก็บคู่คีย์ - ค่าในหน่วยความจำที่สามารถอ่านและเขียนได้เร็วขึ้น มันเก็บคีย์ในอาร์เรย์และค่าใน LinkedList
ให้บอกว่าฉันต้องการเก็บค่าคีย์ 4 คู่ -
{
“girl” => “ahhan” ,
“misused” => “Manmohan Singh” ,
“horsemints” => “guess what”,
“no” => “way”
}
ดังนั้นเพื่อเก็บกุญแจเราต้องมีองค์ประกอบ 4 อย่าง ตอนนี้ฉันจะแมปหนึ่งใน 4 คีย์เหล่านี้กับดัชนีอาร์เรย์ 4 รายการ (0,1,2,3) ได้อย่างไร
ดังนั้นจาวาจะค้นหา hashCode ของแต่ละคีย์และแมปไปยังดัชนีอาเรย์เฉพาะ สูตร Hashcode คือ -
1) reverse the string.
2) keep on multiplying ascii of each character with increasing power of 31 . then add the components .
3) So hashCode() of girl would be –(ascii values of l,r,i,g are 108, 114, 105 and 103) .
e.g. girl = 108 * 31^0 + 114 * 31^1 + 105 * 31^2 + 103 * 31^3 = 3173020
Hash and girl !! ฉันรู้ว่าคุณกำลังคิดอะไรอยู่ ความหลงใหลในเพลงคู่นั้นอาจทำให้คุณพลาดสิ่งสำคัญ
ทำไมจาวาทวีคูณมันด้วย 31?
เป็นเพราะ 31 เป็นเลขคี่ในรูปแบบ 2 ^ 5 - 1 และไพรม์ไพรม์ช่วยลดโอกาสที่ Hash Collision
ตอนนี้รหัสแฮชนี้ถูกแมปกับดัชนีอาร์เรย์อย่างไร
Hash Code % (Array length -1)
คำตอบคือ ดังนั้น“girl”
จะถูกแมป(3173020 % 3) = 1
ในกรณีของเรา ซึ่งเป็นองค์ประกอบที่สองของอาร์เรย์
และค่า“ ahhan” จะถูกเก็บไว้ใน LinkedList ที่เชื่อมโยงกับดัชนีอาร์เรย์ 1
HashCollision - หากคุณพยายามที่จะหาhasHCode
กุญแจ“misused”
และ ใช้สูตรที่อธิบายข้างต้นคุณจะเห็นทั้งสองให้เราเหมือนกัน“horsemints”
1069518484
Whooaa !! บทเรียนที่ได้เรียนรู้ -
2 วัตถุที่เท่ากันต้องมี hashCode เดียวกัน แต่ไม่มีการรับประกันว่า hashCode ตรงกันแล้ววัตถุนั้นจะเท่ากัน ดังนั้นจึงควรเก็บค่าทั้งสองที่สอดคล้องกับ "ผิด" และ "horsemints" เพื่อฝากข้อมูล 1 (1069518484% 3)
ตอนนี้แผนที่แฮชดูเหมือน -
Array Index 0 –
Array Index 1 - LinkedIst (“ahhan” , “Manmohan Singh” , “guess what”)
Array Index 2 – LinkedList (“way”)
Array Index 3 –
ตอนนี้ถ้าร่างกายบางส่วนพยายามที่จะหาค่าสำหรับคีย์“horsemints”
, Java อย่างรวดเร็วจะพบ hashCode ของมันโมดูลมันและเริ่มต้นการค้นหาสำหรับค่าของมันใน LinkedList index 1
ที่สอดคล้องกัน ด้วยวิธีนี้เราไม่จำเป็นต้องค้นหาดัชนีทั้ง 4 แถวทำให้การเข้าถึงข้อมูลเร็วขึ้น
แต่รอหนึ่งวินาที มี 3 ค่าใน linkedList ที่สอดคล้องกันรายการที่ 1 ดัชนีว่าจะหาว่าอันไหนที่เป็นค่าสำหรับคีย์ "horsemints"?
ที่จริงฉันโกหกเมื่อฉันพูด HashMap เพียงแค่เก็บค่าไว้ใน LinkedList
มันเก็บทั้งคู่ค่าคีย์เป็นรายการแผนที่ ดังนั้นแผนที่จะเป็นแบบนี้
Array Index 0 –
Array Index 1 - LinkedIst (<”girl” => “ahhan”> , <” misused” => “Manmohan Singh”> , <”horsemints” => “guess what”>)
Array Index 2 – LinkedList (<”no” => “way”>)
Array Index 3 –
ตอนนี้คุณสามารถเห็นได้ว่าในขณะที่ผ่าน TravellingList ที่สอดคล้องกับ ArrayIndex1 จริง ๆ แล้วจะเปรียบเทียบคีย์ของแต่ละรายการกับ LinkedList นั้นกับ“ horsemints” และเมื่อพบว่ามันเพิ่งส่งคืนค่าของมัน
หวังว่าคุณจะสนุกในขณะที่อ่าน :)