ホームページ  >  記事  >  Java  >  JavaでのHashtableとHashMapの違いの分析

JavaでのHashtableとHashMapの違いの分析

巴扎黑
巴扎黑オリジナル
2017-05-21 14:22:241479ブラウズ

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. Hashtable のメソッドは同期されますが、HashMap のメソッドはデフォルトでは同期されません。つまり、マルチスレッド アプリケーションでは、Hashtable は特別な操作なしで安全に使用できますが、HashMap の場合は追加の同期メカニズムが必要です。しかし、HashMap の同期の問題は、Collections の静的メソッドを通じて解決できます:

コードは次のとおりです:

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)

このメソッドは、同期された Map を返します。これは、返された Map がスレッドセーフであることを意味します。返されたマップを反復するときは、返されたマップを手動で同期する必要があることに注意してください。そうしないと、不確実な動作が発生します:

コードは次のとおりです:

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 をキーとして使用できます。 、そのようなキーは 1 つだけあり、対応する値が null のキーは 1 つ以上存在する可能性があります。 get() メソッドが null 値を返す場合、HashMap にキーが存在しないことを意味することも、キーに対応する値が null であることも意味することもあります。したがって、HashMap では、get() メソッドを使用して特定のキーが HashMap に存在するかどうかを判断することはできませんが、containsKey() メソッドを使用して判断する必要があります。 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 はハッシュ値を再計算し、代わりに AND を使用します。 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。