ホームページ  >  記事  >  Java  >  Map と Java の HashMap、Hashtable、HashSet の違いの簡単な分析

Map と Java の HashMap、Hashtable、HashSet の違いの簡単な分析

高洛峰
高洛峰オリジナル
2017-01-19 10:29:101648ブラウズ

HashTableとHashMapの違い

まず、継承される親クラスが異なります。
HashtableはDictionaryクラスを継承し、HashMapはAbstractMapクラスを継承します。ただし、どちらも Map インターフェイスを実装しています。

public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, Serializable
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable


2 番目に、スレッドの安全性が異なります。
Hashtable のメソッドは同期されますが、HashMap のメソッドはデフォルトで非同期です。マルチスレッドの同時実行環境では、Hashtable のメソッドを自分で同期せずに直接使用できますが、HashMap を使用する場合は、自分で同期処理を追加する必要があります。


第三に、containsメソッドを提供するかどうか、HashMapはHashtableのcontainsメソッドを削除し、containsValueとcontainsKeyに変更しました。これは、containsメソッドは誤解を招きやすいためです。

Hashtable は、contains、containsValue、containsKey の 3 つのメソッドを保持します。このうち、contains と containsValue は同じ機能を持ちます。

4 番目に、キーと値が null 値を許可するかどうか。

キーと値は両方ともオブジェクトであり、重複したキーを含めることはできませんが、重複した値を含めることはできます。
Hashtable では、キーと値の両方に null 値は許可されません。
HashMap では、null をキーとして使用できますが、そのようなキーは 1 つだけあり、対応する値が null であるキーは 1 つ以上存在する可能性があります。 get() メソッドが null 値を返す場合、HashMap にキーが存在しないか、キーに対応する値が null である可能性があります。したがって、HashMap では、get() メソッドを使用して特定のキーが HashMap に存在するかどうかを判断することはできませんが、containsKey() メソッドを使用して判断する必要があります。

第 5 に、2 つのトラバーサル メソッドの内部実装が異なります。

Hashtable と HashMap はどちらも Iterator を使用します。歴史的な理由により、Hashtable も列挙を使用します。

第六に、ハッシュ値が異なります。

ハッシュ値の使用方法が異なります。HashTable はオブジェクトの hashCode を直接使用します。そしてHashMapはハッシュ値を再計算します。

7 番目に、内部実装では異なる配列の初期化メソッドと拡張メソッドが使用されます。

Hashtable と HashMap は、2 つの内部実装における配列の初期サイズと拡張メソッドです。 HashTable のハッシュ配列のデフォルトのサイズは 11 で、増加方法は old*2+1 です。

HashMap のハッシュ配列のデフォルトのサイズは 16 で、指数は 2 である必要があります。

Java の Map と HashMap、Hashtable、HashSet の違いに関するその他の記事については、PHP 中国語 Web サイトに注目してください。


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