java에서 Hashtable과 HashMap의 차이점 분석

3344 단어 HashtableHashMap
1. Hashtable은 Dictionary의 하위 클래스입니다

 public class Hashtable<K,V>
     extends Dictionary<K,V>
     implements Map<K,V>, Cloneable, java.io.Serializable
HashMap:

public class HashMap<K,V>
    extends AbstractMap<K,V>
     implements Map<K,V>, Cloneable, Serializable
HashMap과 Hashtable은 모두 맵 인터페이스의 실현 클래스이다.
2. Hashtable의 방법은 동기화()이고 HashMap의 방법은 기본적으로 동기화되지 않습니다.즉, 다중 루틴 응용 프로그램에서 전문적인 조작 없이hashtable를 안전하게 사용할 수 있다는 것이다.HashMap의 경우 추가 동기화 메커니즘이 필요합니다.그러나 HashMap의 동기화 문제는 Collections의 정적 방법으로 해결될 수 있습니다

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
이 방법은 동기화된 맵을 되돌려줍니다. 즉, 되돌아오는 맵은 안전하다는 것입니다.주의해야 할 것은 되돌아오는 맵을 교체할 때 반드시 수동으로 되돌아오는 맵에 동기화해야 한다는 것이다. 그렇지 않으면 불확실한 행동을 초래할 수 있다

Map m = Collections.synchronizedMap(new HashMap());
       ...
   Set s = m.keySet();  // Needn't be in synchronized block
       ...
   synchronized(m) {  // Synchronizing on m, not s!
       Iterator i = s.iterator(); // Must be in synchronized block
       while (i.hasNext())
           foo(i.next());
   }
3.HashMap에서null은 키로 사용할 수 있는데 이런 키는 하나밖에 없다.하나 이상의 키가 대응하는 값은null입니다.get () 방법이null 값을 되돌릴 때, HashMap에 이 키가 없다는 것을 나타낼 수도 있고, 이 키에 대응하는 값이null이라는 것을 나타낼 수도 있습니다.따라서 HashMap에서 get() 방법으로 HashMap에 키가 있는지 판단할 수 없으며,containsKey() 방법으로 판단해야 한다.Hashtable의 키 값은null일 수 없습니다. 그렇지 않으면:java.lang.NullPointerException .4. HashTable은 Enumeration, HashMap은 Iterator를 사용합니다.이상은 표면적인 차이일 뿐 그들의 실현도 크게 다르다.5.HashTable에서hash수조의 기본 크기는 11이며, 추가 방식은old*2+1입니다.HashMap에서 Hash수 그룹의 기본 크기는 16이고 반드시 2의 지수입니다.6. 해시 값의 사용에 따라 해시테이블은 대상의 해시코드를 직접 사용하는데 코드는 다음과 같다

int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
그리고 HashMap은hash값을 다시 계산하고 구모를 대체합니다. 예를 들어 HashMap의put방법:

public V put(K key, V value) {
         if (key == null)
             return putForNullKey(value);
         int hash = hash(key.hashCode());
         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;
     }

static int hash(int h) {
         // This function ensures that hashCodes that differ only by
         // constant multiples at each bit position have a bounded
         // number of collisions (approximately 8 at default load factor).
         h ^= (h >>> 20) ^ (h >>> 12);
         return h ^ (h >>> 7) ^ (h >>> 4);
     }

   static int indexFor(int h, int length) {
         return h & (length-1);
     }

좋은 웹페이지 즐겨찾기