java 면접문제 - 해시맵과 해시테이블의 차이점

3259 단어 hashmaphashtable
하나.Hash Map과 Hashtable의 차이점
일단 두 가지 종류의 정의를 볼게요.

 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에서 키 값을 비워 동기화할 수 없습니다.
계승은 다르지만 모두 맵 인터페이스를 실현했다
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기