1.ハッシュマップとハッシュテーブルの違い
まず、2つのクラスの定義を見てみましょう
パブリッククラスのハッシュテーブルは、辞書を拡張します。マップ、cloneable、java.io.serializableを拡張します
Public Class HashMapは、AbstractMapを拡張します。マップ、クローン可能、シリアル化可能です
ハッシュテーブルが辞書から継承され、ハッシュマップがAbstractMapから継承することがわかります
ハッシュテーブルのプット方法は次のとおりです
public synchronized v put(k key、v value){// ########## note here 1 //値がnullでないことを確認してください(value == null){// ####### note } //キーがまだハッシュテーブルにないことを確認します。エントリタブ[] =テーブル; int hash = key.hashcode(); // ########ここに3 int index =(hash&0x7fffffff)%tab.length; for(entre e = tab [index]; e!= null; e = e.next){if((e.hash == hash)&& e.key.equals(key)){v old = e.value; e.value = value;古いものを返します。 }} modcount ++; if(count> =しきい値){//しきい値を超えている場合、テーブルを再ハッシュ(); tab = table; index =(hash&0x7fffffff)%tab.length; } //新しいエントリを作成します。エントリE =タブ[index];タブ[index] = new entry(hash、key、value、e); count ++; nullを返します。 }注1メソッドは同期です
注2メソッドはvalue == nullを許可しません
注3メソッドは、キーのハッシュコードメソッドを呼び出します。 key == nullの場合、nullポインターの例外がスローされます。ハッシュマップのPUT方法は次のとおりです。
public v put(k key、v value){// ##########ここに注1 if(key == null)// #########ノートint hash = hash(key.hashcode()); int i = indexfor(hash、table.length); for(entre 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); OldValueを返します。 }} modcount ++; Addentry(Hash、Key、Value、I); // ########ここにnullを返します。 }注1メソッドは非同期です
注2メソッドは、key == nullを許可します
注3メソッドは値に呼び出しを行わないため、nullにすることが許可されています。
補充:
ハッシュテーブルには、誤解を容易に引き起こす可能性のあるメソッドが含まれているため、ハッシュマップで削除されています。
もちろん、両方のクラスはContainsKeyとcontassValueメソッドを使用します。
| ハッシュマップ | ハッシュテーブル | |
| 親クラス | AbstractMap | 辞書 |
| 同期していますか | いいえ | はい |
| k、v null | はい | いいえ |
HashMapは、ハッシュテーブルの軽量実装です(非スレッドセーフ実装)。それらはすべて、マップインターフェイスを完了します。主な違いは、Hashmapがnullキーを許可することです。非スレッドセーフのため、ハッシュテーブルよりも効率的かもしれません。
HashMapは、エントリのキーまたは値としてnullを許可しますが、Hashtableではそうではありません。
HashMapは、Hashtable Contingメソッドを削除し、ValueとContainsKeyを含むように変更します。 containsメソッドは誤解を引き起こすのは簡単だからです。
ハッシュテーブルは辞書クラスから継承され、ハッシュマップはJava 1.2によって導入されたMAPインターフェイスの実装です。
最大の違いは、ハッシュテーブル方法が同期することですが、ハッシュマップは同期していません。複数のスレッドがハッシュテーブルにアクセスする場合、そのメソッド自体を同期する必要はなく、ハッシュマップは外部同期(Collections.synchronizedMap)を提供する必要があります。
ハッシュテーブルとハッシュマップで使用されるハッシュ/リハッシュアルゴリズムはほぼ同じであるため、パフォーマンスに大きな違いはありません。
要約:
ハッシュマップの重要な値は空になり、非同期であることが許可されています
ハッシュテーブルのキー値は無効になることは許可されておらず、同期されます
継承は異なりますが、両方ともマップインターフェイスを実装します
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。