그것은 긴 대답이 될 것입니다, 음료를 잡고 읽어 ...
해싱은보다 빠르게 읽고 쓸 수있는 키-값 쌍을 메모리에 저장하는 것입니다. 배열에 키를 저장하고 LinkedList에 값을 저장합니다.
4 개의 키-값 쌍을 저장하고 싶다고합시다.
{
“girl” => “ahhan” ,
“misused” => “Manmohan Singh” ,
“horsemints” => “guess what”,
“no” => “way”
}
따라서 키를 저장하려면 4 요소의 배열이 필요합니다. 이제이 4 개의 키 중 하나를 4 개의 배열 인덱스 (0,1,2,3)에 어떻게 매핑합니까?
따라서 java는 개별 키의 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
해시와 소녀 !! 나는 당신이 무엇을 생각하는지 안다. 그 야생 듀엣에 대한 당신의 매력은 당신이 중요한 것을 놓치게 만들 수 있습니다.
왜 자바에 31을 곱합니까?
31은 2 ^ 5 – 1 형식의 홀수입니다. 홀수 프라임은 해시 충돌 가능성을 줄입니다.
이 해시 코드가 어떻게 배열 인덱스에 매핑됩니까?
대답은 Hash Code % (Array length -1)
입니다. 따라서 우리의 경우에 “girl”
매핑됩니다 (3173020 % 3) = 1
. 이것은 배열의 두 번째 요소입니다.
그리고 "ahhan"값은 배열 인덱스 1과 연관된 LinkedList에 저장됩니다.
HashCollision - 찾을하려고하면 hasHCode
키의 “misused”
와 “horsemints”
당신 위에서 설명한 공식을 사용하여 모두 같은 우리를주고 볼 수 있습니다 1069518484
. 우와! 교훈-
2 개의 동일한 객체는 동일한 hashCode를 가져야하지만 hashCode가 일치하면 객체가 동일한 지 보장 할 수 없습니다. 따라서 "misused"및 "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 개의 배열 인덱스를 모두 검색 할 필요가 없으므로 데이터 액세스 속도가 빨라집니다.
그러나 잠시만 기다려주십시오. linkedList 1에 해당하는 3 개의 값이 있는데, 어떤 값이 "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 –
이제 ArrayIndex1에 해당하는 linkedList를 통과하는 동안 실제로는 각 항목의 키를 해당 LinkedList의 키와 "horsemints"를 비교하고 하나를 찾으면 그 값을 반환합니다.
당신이 그것을 읽는 동안 재미 있었기를 바랍니다 :)