Java 해싱 스토리지 상세 정보 및 간단한 예
자바에 산열되어 저장된 데이터 구조는 주로 HashSet,HashMap,LinkedHashSet,LinkedHashMap,HashTable 등을 가리킨다.자바의 산열 저장 메커니즘을 이해하려면 equals () 와hashCode () 두 가지 방법을 먼저 이해해야 합니다.equals () 방법과 "=="관계 조작부호와의 차이에 대해 우리는 다른 문장 에서 이미 설명하였다.HashCode()는 Object 클래스에서 정의하는 방법입니다.
public native int hashCode();
이것은 int 값을 되돌려주는 로컬 방법으로 Object 클래스에서 실현되지 않았습니다.이 방법은 주로 산열을 사용하는 데이터 구조에 응용되고 산열을 바탕으로 하는 집합과 함께 정상적으로 운행된다. 예를 들어 하나의 용기(우리가 가정하면 HashMap)에 하나의 대상을 삽입할 때 용기에 이미 이 대상이 존재하는지 어떻게 판단합니까?용기 속의 원소가 수천 수만에 달할 수 있기 때문에 equals () 방법을 사용하여 순서대로 비교하는 것은 매우 저효적이다.산열의 가치는 속도에 있다. 키를 빨리 찾을 수 있도록 어디에 저장한다.한 그룹의 요소를 가장 빨리 저장하는 데이터 구조는 수조이기 때문에 키의 정보를 저장하기 위해 사용한다. (키 자체가 아니라 키의 정보를 주의하라.)그러나 수조가 용량을 조정할 수 없기 때문에 문제가 하나 있다. 우리는 맵에 수량이 확실하지 않은 값을 저장하기를 원하지만, 키의 수량이 수조의 용량에 제한되면 어떻게 해야 합니까?답은 바로 수조는 키 자체를 저장하지 않고 키 대상을 통해 숫자를 생성하여 수조의 하표로 삼는다. 이 숫자는 산열 코드(hashcode)로 Object에 정의되고 클래스가 덮어쓸 수 있는hashCode() 방법으로 생성된다.수조 용량이 고정된 문제를 해결하기 위해 서로 다른 키가 같은 하표를 만들 수 있는데 이런 현상을 충돌이라고 부른다.따라서 용기에서 값을 조회하는 과정은hashCode () 를 통해 삽입할 대상의 산열 코드를 계산한 다음에 산열 코드를 사용하여 그룹을 조회하는 것이다.충돌에 대한 처리는 외부 링크를 통해 이루어진다. 즉, 수조는 값을 직접 저장하지 않고 값을 저장하는list를 통해list의 값을 선형으로 조회하는데 이 부분의 조회는 자연히 비교적 느릴 것이다.그러나 산열 함수가 충분하면 그룹의 모든 위치는 비교적 적은 값만 있을 뿐이다.따라서 산열 메커니즘은 수조의 어느 위치로 빠르게 뛰어들어 아주 적은 원소만 비교할 수 있다.이것이 바로 HashMap이 이렇게 빠를 수 있는 이유입니다. 우리는 HashMap을 통과할 수 있습니다.put () 메서드는 다음과 같습니다.
public V put(K key, V value) {
if (table == EMPTY_TABLE) {
inflateTable(threshold);
}
if (key == null)
return putForNullKey(value);
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
그 주요 사상은 바로 키가 비어 있지 않을 때 키 대상에 따라 해시코드hash를 얻고 해시코드를 통해 수조의 하표 i를 얻는 것이다.table[i]가 표시한list에서 교체를 하고 equals()를 통해 이 키가 존재하는지 판단하고 존재하면 새 값으로 낡은 값을 업데이트하고 낡은 값을 되돌려줍니다.그렇지 않으면 HashMap에 새 키 값 쌍을 추가합니다.여기서 알 수 있듯이hashCode 방법의 존재는 equals 방법의 호출 횟수를 줄이고 프로그램 효율을 높이기 위한 것이다.여기에서 우리는 주의해야 한다:hashCode () 는 항상 유일한 표지 코드를 되돌릴 수 있는 것은 아니지만, equals () 방법은 반드시 두 대상이 같은지 엄격하게 판단해야 한다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.