>Java >java지도 시간 >Java에서 Hashtable과 HashMap의 차이점 분석

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

巴扎黑
巴扎黑원래의
2017-05-21 14:22:241493검색

Java에서 Hashtable과 HashMap의 차이점을 분석해서 필요하신 분들은 참고하시면 됩니다

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은 모두 Map 인터페이스의 구현 클래스입니다.

2. , HashMap의 메소드는 기본적으로 동기화되지 않습니다. 즉, 멀티 스레드 응용 프로그램에서는 HashMap의 경우 특별한 작업 없이 Hashtable을 안전하게 사용할 수 있으므로 추가적인 동기화 메커니즘이 필요합니다. 그러나 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&#39;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에 특정 키가 존재하는지 확인할 수 없고, containKey() 메소드를 사용하여 확인해야 합니다. Hashtable의 키 값은 null일 수 없습니다. 그렇지 않으면 java.lang.NullPointerException입니다.
4.HashTable은 Enumeration을 사용하고, HashMap은 Iterator를 사용합니다.
위의 내용은 표면적인 차이점일 뿐이며 구현 방식도 매우 다릅니다.
5. HashTable의 해시 배열의 기본 크기는 11이고, 증가 방식은 old*2+1입니다. HashMap의 해시 배열의 기본 크기는 16이고 지수는 2여야 합니다.
6. 해시값의 사용이 다릅니다. HashTable은 객체의 hashCode를 직접 사용합니다.

코드는 다음과 같습니다.

int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;

HashMap이 해시 값을 다시 계산하는 동안 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);
     }

위 내용은 Java에서 Hashtable과 HashMap의 차이점 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.