1. 概要

この短いチュートリアルでは、HashtableHashMapの主な違いに焦点を当てます。

2. JavaのHashtableおよびHashMap

HashtableHashMapは非常によく似ており、どちらもMapインターフェイスを実装するコレクションです。

また、 put() get() remove()、および containsKey()メソッドは、一定時間のパフォーマンスを提供しますO (1)。 内部的には、これらのメソッドは、データを格納するためのバケットを使用したハッシュの一般的な概念に基づいて機能します。

どちらのクラスも、要素の挿入順序を維持しません。 つまり、値を反復処理すると、最初に追加されたアイテムが最初のアイテムではない場合があります。

ただし、状況によっては、違いがあり、違いがあります。 これらの違いを詳しく見てみましょう。

3. HashtableHashMapの違い

3.1. 同期

まず、ハッシュテーブルはスレッドセーフであり、アプリケーション内の複数のスレッド間で共有できます。

一方、 HashMap は同期されておらず、追加の同期コードがないと複数のスレッドからアクセスできません。 Collections.synchronizedMap()を使用して、HashMapのスレッドセーフバージョンを作成できます。 synchronized キーワードを使用して、カスタムロックコードを作成したり、コードをスレッドセーフにすることもできます。

HashMap は同期されていないため、 Hashtable よりも高速で、使用するメモリも少なくて済みます。 一般に、同期されていないオブジェクトは、シングルスレッドアプリケーションで同期されているオブジェクトよりも高速です。

3.2. ヌル値

もう1つの違いは、nullの処理です。 HashMap を使用すると、nullをキーとして1つのEntryを追加したり、nullを値として多数のエントリを追加したりできます。 対照的に、Hashtableはnullをまったく許可しませんnullHashMapの例を見てみましょう。

HashMap<String, String> map = new HashMap<String, String>();
map.put(null, "value");
map.put("key1", null);
map.put("key2", null);

これにより、次のようになります。

assertEquals(3, map.size());

次に、Hashtableがどのように異なるかを見てみましょう。

Hashtable<String, String> table = new Hashtable<String, String>();
table.put("key", null);

これにより、NullPointerExceptionが発生します。 null をキーとしてオブジェクトを追加すると、NullPointerExceptionも発生します。

table.put(null, "value");

3.3. 要素の反復

HashMapIteratorを使用して値を反復処理しますが、HashtableにはEnumeratorがあります。 Iterator は、 Enumerator の後継であり、いくつかの欠点を排除しています。 たとえば、 Iterator には、基になるコレクションから要素を削除するための remove()メソッドがあります。

イテレータフェイルファストイテレータです。 つまり、反復中に基になるコレクションが変更されると、ConcurrentModificationExceptionがスローされます。 フェイルファストの例を見てみましょう。

HashMap<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");

Iterator<String> iterator = map.keySet().iterator();
while(iterator.hasNext()){ 
    iterator.next();
    map.put("key4", "value4");
}

コレクションを反復処理しているときにput()を呼び出しているため、これによりConcurrentModificationException例外がスローされます。

4. HashtableよりもHashMapを選択する場合

非同期またはシングルスレッドのアプリケーションには、HashMapを使用する必要があります。

JDK 1.8以降、Hashtableは非推奨になりました。 ただし、 ConcurrentHashMap は、Hashtableの優れた代替品です。 複数のスレッドを持つアプリケーションで使用するには、ConcurrentHashMapを検討する必要があります。

5. 結論

この記事では、HashMapHashtableの違いと、どちらかを選択する必要がある場合の注意点について説明しました。

いつものように、これらすべての例とコードスニペットの実装はGithub上にあります。