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'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 중국어 웹사이트의 기타 관련 기사를 참조하세요!