java 면접문제 - 해시맵과 해시테이블의 차이점
일단 두 가지 종류의 정의를 볼게요.
public class Hashtable
extends Dictionary
implements Map, Cloneable, java.io.Serializable
public class HashMap
extends AbstractMap
implements Map, Cloneable, Serializable
Hashtable은 Dictiionary, HashMap은 AbstractMap에서 상속됨을 알 수 있습니다.Hashtable의 put 방법은 다음과 같습니다.
public synchronized V put(K key, V value) { //###### 1
// Make sure the value is not null
if (value == null) { //###### 2
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry tab[] = table;
int hash = key.hashCode(); //###### 3
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry e = tab[index]; e != null; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
V old = e.value;
e.value = value;
return old;
}
}
modCount++;
if (count >= threshold) {
// Rehash the table if the threshold is exceeded
rehash();
tab = table;
index = (hash & 0x7FFFFFFF) % tab.length;
}
// Creates the new entry.
Entry e = tab[index];
tab[index] = new Entry(hash, key, value, e);
count++;
return null;
}
주의 1 방법은 동기화됩니다주의2 방법은value==null
주의3 방법은 키의hashCode 방법을 호출했습니다. 만약에 키=null이면 빈 바늘이 이상하게 HashMap의put 방법은 다음과 같습니다.
public V put(K key, V value) { //###### 1
if (key == null) //###### 2
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry 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;
}
주의 1 방법은 비동기적입니다주의2 방법은 key==null
주의3 방법은value에 대한 호출이 없기 때문에null로 허용합니다
보충:
Hashtable에 contains 방법이 있는데 오해를 일으키기 쉬워서 HashMap에서 뺐어요.
물론 두 종류는 모두containsKey와containsValue 방법을 사용한다.
HashMap
Hashtable
부류
AbstractMap
Dictiionary
동기화 여부
아니오
예.
k,v가부null
예.
아니오
HashMap은 Hashtable의 경량급 실현(비스레드 안전의 실현)이다. 그들은 모두 맵 인터페이스를 완성했다. 주요한 차이점은 HashMap이 비어 있는 키 값(null)을 허용하는 데 있다. 비스레드 안전으로 인해 효율이 Hashtable보다 높을 수 있다.
HashMap은 null을 entry의 키나value로 허용하지만, Hashtable은 허용하지 않습니다.
HashMap은 Hashtable의contains 방법을 제거하고containsvalue와containsKey로 변경합니다.contains 방법은 오해를 불러일으키기 쉽기 때문이다.
Hashtable은 Dictionary 클래스를 계승하고 HashMap은 자바 1.2가 도입한 맵 인터페이스의 실현이다.
가장 큰 차이점은 Hashtable의 방법은 Synchronize인데 HashMap은 여러 라인이 Hashtable에 접근할 때 스스로 그 방법을 동기화할 필요가 없고 HashMap은 반드시 외부 동기화(Collections.synchronized Map)를 제공해야 한다는 것이다.
Hashtable과 HashMap이 사용하는hash/rehash 알고리즘은 모두 대충 같기 때문에 성능에 큰 차이가 없을 것이다.
요약:
HashMap에서 키 값이 비어 있고 비동기화될 수 있음
Hashtable에서 키 값을 비워 동기화할 수 없습니다.
계승은 다르지만 모두 맵 인터페이스를 실현했다
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java HashMaps:5 시작하기 위한 중요한 사항What is Hashing and What are Java HashMaps? When to use Java HashMaps? Application of HashMaps in DSA Problems? How to I...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.