ホームページ  >  記事  >  Java  >  JAVAのHashMapとHashtableの違い

JAVAのHashMapとHashtableの違い

PHP中文网
PHP中文网オリジナル
2017-06-22 13:36:011491ブラウズ

HashMap と Hashtable の比較は、Java の面接でよく聞かれる質問で、プログラマーがコレクション クラスを正しく使用できるか、状況に応じてさまざまなアイデアを使用して問題を解決できるかをテストするために使用されます。 HashMap の動作原理、ArrayList と Vector の比較、およびこの質問は、Java コレクション フレームワークに関する最も古典的な質問です。 Hashtable は、Java API に長い間存在していた、廃止されたコレクション クラスです。これは Java 4 で書き直され、Map インターフェイスが実装されたため、それ以来 Java コレクション フレームワークの一部になりました。 Hashtable と HashMap は Java の面接で非常に簡単に質問され、コレクション フレームワークの面接の質問でも最もよく聞かれる質問となっているため、Java の面接に参加する前にこの質問の準備を忘れないようにしてください。

この記事では、HashMap と Hashtable の違いだけでなく、両者の類似点についても説明します。

HashMap と Hashtable の違い

HashMap と Hashtable はどちらも Map インターフェースを実装していますが、どちらを使用するかを決める前に、まずそれらの違いを理解する必要があります。主な違いは、スレッド セーフ、同期、速度です。

HashMap は Hashtable とほぼ同等ですが、HashMap は非同期で null を受け入れることができます (HashMap は null のキーと値を受け入れることができますが、Hashtable は受け入れることができません)。

HashMap は非同期ですが、Hashtable は同期されます。つまり、Hashtable はスレッドセーフであり、複数のスレッドが Hashtable を共有できますが、正しく同期しないと、複数のスレッドは HashMap を共有できません。 Java 5 は ConcurrentHashMap を提供します。これは HashTable の代替品であり、HashTable よりも優れたスケーラビリティを備えています。

もう 1 つの違いは、HashMap のイテレータ (Iterator) はフェイルファスト イテレータであるのに対し、Hashtable の列挙イテレータはフェイルファストではないことです。そのため、他のスレッドが HashMap の構造を変更する (要素の追加または削除) と、ConcurrentModificationException がスローされますが、要素を削除するときにイテレーター自体の Remove() メソッドは ConcurrentModificationException をスローしません。ただし、これは保証された動作ではなく、JVM に依存します。これは列挙型と反復子の違いでもあります。

Hashtable はスレッドセーフで同期されているため、シングルスレッド環境では HashMap よりも遅くなります。同期が必要なく、単一のスレッドのみが必要な場合は、HashMap を使用した方が Hashtable よりもパフォーマンスが高くなります。

HashMap は、Map 内の要素の順序が時間が経っても変わらないことを保証できません。

注意すべき重要な用語:

1) 同期とは、一度に 1 つのスレッドだけがハッシュテーブルを変更できることを意味します。つまり、ハッシュテーブルを更新したいスレッドはまず同期ロックを取得する必要があり、他のスレッドは同期ロックを再度取得してハッシュテーブルを更新する前に、同期ロックが解放されるまで待機する必要があります。

2) フェイルセーフは反復子に関連しています。コレクション オブジェクトが Iterator または ListIterator を作成し、その後他のスレッドがコレクション オブジェクトを「構造的に」変更しようとすると、ConcurrentModificationException がスローされます。ただし、コレクションは「構造的に」変更されないため、他のスレッドが set() メソッドを通じてコレクション オブジェクトを変更することは許可されています。ただし、構造が変更されて set() メソッドが再度呼び出される場合は、IllegalArgumentException がスローされます。

3) 構造の変更とは、マップの構造に影響を与える要素の削除または挿入を指します。

HashMapを同期できますか?

HashMap は、次のステートメントを通じて同期できます:
Map m = Collections.synchronizeMap(hashMap);

結論

Hashtable と HashMap には、スレッドの安全性と速度といういくつかの大きな違いがあります。 Hashtable は完全なスレッド セーフが必要な場合にのみ使用し、Java 5 以降を使用している場合は ConcurrentHashMap を使用してください。

以上がJAVAのHashMapとHashtableの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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