누구든지 해시 맵의 작동 메커니즘을 설명하게한다면 간단히 대답하겠습니다. "해시 기반 규칙". 이 문장은 매우 간단하지만이 문장을 이해하기 전에 먼저 ISH가 무엇인지 이해해야합니까?
Beh는 무엇입니까
Hash는 단순히 변수/객체의 속성이 특정 알고리즘에 적용된 후 얻은 고유 한 문자열이며,이 문자열은 변수/객체의 고유성을 결정하는 데 사용됩니다. 올바른 해시 함수는이 기준을 준수해야합니다.
해시 함수가 동일한 객체 또는 동일한 객체에 적용되면 각 실행은 동일한 값을 반환해야합니다. 다시 말해, 두 개의 동일한 객체는 동일한 해시 코드를 가져야합니다.
참고 : 모든 Java 개체는 객체 클래스에서 기본 해시 코드 () 메소드를 상속합니다. 이 메소드는 메모리의 주소를 정수로 반환합니다.
항목 클래스에 대한 한 가지 소개
맵의 정의는 다음과 같습니다. 매핑 키에서 값으로 객체. 아주 간단합니까?
따라서 해시 맵에는 이러한 주요 값 쌍을 저장하려면 특정 메커니즘이 있어야합니다. Hashmap Make Hashmap에는 내부 클래스 항목이 있습니다.
정적 클래스 항목 <k, v> emp.
물론 입력 클래스에는 키 값을 저장할 속성이 있습니다. 키는 키와 값 외에 최종적으로 표시됩니다. 다음으로 우리는이 변수의 의미를 이해하려고 노력합니다.
put () 메소드는 실제로 무엇을합니까?
PUT 방법의 구현을보기 전에 배열에서 입력 인스턴스의 저장을 살펴볼 필요가 있습니다.
/ ** * 테이블은 거주지를 크기로 지정합니다. /*** 지정된 값을이 맵에서 지정된 키와 연관시킵니다.* 이전에 키에 포함 된 맵이 CED입니다. 지정된 key* @return과 관련된 값 값 </tt> 또는* <tt> null </tt>와 관련된 이전 값을 e /tt>. 반환은 또한 MAP* 이전 연관 <TT> null </tt> key </tt>.)*/public v put (k key, value) {if (key == null) return putfornullkey (value)를 나타냅니다. int hash = int int int <k, v> e = 테이블 [e! = e = e.next) {객체 k; && (k = e.key) = key.equals (k)) {vallue = value; , 키, 모두); return null;}
단계별로 보자
우선, 키가 null 값의 위치인지 여부를 확인하십시오.
다음으로,이 키의 해시 값은 키 hashcode () 메소드를 통해 계산되며, 이는 항목 객체의 배열에서 위치를 계산하는 데 사용됩니다. JDK의 디자이너는 일부 사람들이 매우 열악한 해시 코드 () 방법을 작성할 수 있으며 매우 크거나 작은 해시 값이있을 것이라고 가정합니다. 이 문제를 해결하기 위해, 그들은 객체의 hashcode ()를 받아들이고 배열의 용량으로 변환하기 위해 다른 해시 함수를 도입했습니다.
다음은 입력 객체 저장소의 정확한 위치를 계산하는 Indexfor (Hash, Table, Length) 메소드입니다.
다음은 주요 부분입니다. 우리는 두 개의 다른 객체가 동일한 해시 코드 값을 가질 수 있다는 것을 알고 있습니다.
답은 링크드 목록입니다. 기억한다면, 항목 클래스에는 다음 변수가 있으며,이 변수는 항상 체인의 다음 변수를 가리키며,이 변수는 링크 된 목록의 특성을 완전히 충족합니다.
따라서 충돌이 발생하면 입력 객체가 링크 된 목록의 형태로 저장됩니다. 현재 입력 객체는 저장된 입력 객체의 다음 노드로 사용됩니다.
기존 키를 다른 값으로 저장하면 어떻게됩니까? 논리적으로 이전 값은 대체됩니다. 입력 오브젝트의 스토리지 위치를 감지 한 후 Hashmap은 해당 위치에서 입력 링크 목록을 Equals 메소드를 호출합니다. Equals 메소드가 동일하다는 것을 알게되면 교체가 수행됩니다.
이런 식으로 해시 맵은 키의 독창성을 보장 할 수 있습니다.
Get 메소드의 작업 메커니즘
이제 우리는 해시 맵에서 스토리지 메커니즘을 배웠습니다. 다음 질문은 : 해시 맵의 결과를 쿼리하는 방법입니다.
실제로 로직은 풋 키 일치와 일치하면 널을 반환하십시오.
/*** 지정된 키가 매핑 된 값을 반환합니다. * {@code k} {@code v} {@code v}를 {@code (key == null? k == null :* key.equals (k)} 이므로이 메소드는 {@code v}; o 리턴합니다. {@code null}은 키에 대한 매핑이 포함되어 있지 않습니다. {@link #containskey} 수단은 키를 명시 적으로 맵핑 할 수 있습니다. ** @see #put (object, object)*/public v get (key == null) retud getfornullkey (); )); = 키 ||. 키.
위의 코드는 if (e.hash == hash && ((k = e.key) == key || key.equals (k))을 제외하고는 put () 메소드와 유사하게 보입니다.
주의를 기울이십시오