Javaのハッシュテーブル
の ハッシュ表 クラスは、キーを値にマップするハッシュ テーブルを実装します。 null 以外のオブジェクトはキーまたは値として使用できます。ハッシュテーブルにオブジェクトを正常に格納したり、ハッシュテーブルからオブジェクトを取得したりするには、キーとして使用されるオブジェクトが hashCode メソッドとquals メソッドを実装する必要があります。
java.util.Hashtable クラスは、Map インターフェイスに似たキーと値のデータ構造を提供する Java のクラスです。これは元の Java Collections フレームワークの一部であり、Java 1.0 で導入されました。
ただし、Hashtable クラスは廃止されたものとみなされ、一般にその使用は推奨されません。これは、コレクション フレームワークの導入前に設計されており、Map インターフェイスが実装されていないため、フレームワークの他の部分と組み合わせて使用することが困難になっているためです。さらに、Hashtable クラスは同期されるため、Map インターフェイスの他の実装と比較してパフォーマンスが低下する可能性があります。
一般に、Hashtable クラスの代わりに、Map インターフェイスまたはその実装の 1 つ (HashMap や ConcurrentHashMap など) を使用することをお勧めします。
Hashtable クラスの使用方法の例を次に示します。
ジャワ
import> java.util.Enumeration;> import> java.util.Hashtable;> public> class> Main {> > public> static> void> main(String[] args) {> > Hashtable hashtable => new> Hashtable();> > // Adding elements to the hashtable> > hashtable.put(> 'A'> ,> 1> );> > hashtable.put(> 'B'> ,> 2> );> > hashtable.put(> 'C'> ,> 3> );> > // Getting values from the hashtable> > int> valueA = hashtable.get(> 'A'> );> > System.out.println(> 'Value of A: '> + valueA);> > // Removing elements from the hashtable> > hashtable.remove(> 'B'> );> > // Enumerating the elements of the hashtable> > Enumeration keys = hashtable.keys();> > while> (keys.hasMoreElements()) {> > String key = keys.nextElement();> > System.out.println(> 'Key: '> + key +> ', Value: '> + hashtable.get(key));> > }> > }> }> |
出力
Value of A: 1 Key: A, Value: 1 Key: C, Value: 3
結論として、Hashtable クラスは Java にまだ存在しており、引き続き使用できますが、一般的には代わりに Map インターフェイスまたはその実装の 1 つを使用することをお勧めします。
ハッシュテーブルの特徴
- HashMap に似ていますが、同期されます。
- Hashtable はキーと値のペアをハッシュ テーブルに保存します。
- Hashtable では、キーとして使用されるオブジェクトと、そのキーに関連付ける値を指定します。次に、キーがハッシュされ、結果のハッシュ コードがテーブル内で値が格納されるインデックスとして使用されます。
- Hashtable クラスの初期デフォルト容量は 11 ですが、loadFactor は 0.75 です。
- HashMap は列挙を提供しませんが、Hashtable はフェイルファスト列挙を提供しません。
宣言:
public class Hashtable extends Dictionary implements Map, Cloneable, Serializable
型パラメータ:
- K – このマップによって維持されるキーのタイプ
- で – マップされた値のタイプ
ハッシュテーブルの階層
ハッシュテーブルの実装 シリアル化可能 、 クローン可能 、 地図 インターフェイスと拡張 辞書 。直接のサブクラスは Properties 、 UIデフォルト 。
コンストラクター:
ハッシュテーブルを作成するには、ハッシュテーブルを次からインポートする必要があります。 java.util.ハッシュテーブル 。ハッシュテーブルを作成するにはさまざまな方法があります。
1.ハッシュテーブル(): これにより、デフォルトの負荷係数 0.75 と初期容量 11 の空のハッシュテーブルが作成されます。
ハッシュテーブル ht = new Hashtable();
ジャワ
// Java program to demonstrate> // adding elements to Hashtable> import> java.io.*;> import> java.util.*;> class> AddElementsToHashtable {> > public> static> void> main(String args[])> > {> > // No need to mention the> > // Generic type twice> > Hashtable ht1 => new> Hashtable();> > // Initialization of a Hashtable> > // using Generics> > Hashtable ht2> > => new> Hashtable();> > // Inserting the Elements> > // using put() method> > ht1.put(> 1> ,> 'one'> );> > ht1.put(> 2> ,> 'two'> );> > ht1.put(> 3> ,> 'three'> );> > ht2.put(> 4> ,> 'four'> );> > ht2.put(> 5> ,> 'five'> );> > ht2.put(> 6> ,> 'six'> );> > // Print mappings to the console> > System.out.println(> 'Mappings of ht1 : '> + ht1);> > System.out.println(> 'Mappings of ht2 : '> + ht2);> > }> }> |
出力
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {6=six, 5=five, 4=four} 2.ハッシュテーブル(intinitialCapacity): これにより、initialCapacity で指定された初期サイズとデフォルトの負荷係数 0.75 を持つハッシュ テーブルが作成されます。
ハッシュテーブル ht = 新しいハッシュテーブル(intInitialCapacity);
ジャワ
// Java program to demonstrate> // adding elements to Hashtable> import> java.io.*;> import> java.util.*;> class> AddElementsToHashtable {> > public> static> void> main(String args[])> > {> > // No need to mention the> > // Generic type twice> > Hashtable ht1 => new> Hashtable(> 4> );> > // Initialization of a Hashtable> > // using Generics> > Hashtable ht2> > => new> Hashtable(> 2> );> > // Inserting the Elements> > // using put() method> > ht1.put(> 1> ,> 'one'> );> > ht1.put(> 2> ,> 'two'> );> > ht1.put(> 3> ,> 'three'> );> > ht2.put(> 4> ,> 'four'> );> > ht2.put(> 5> ,> 'five'> );> > ht2.put(> 6> ,> 'six'> );> > // Print mappings to the console> > System.out.println(> 'Mappings of ht1 : '> + ht1);> > System.out.println(> 'Mappings of ht2 : '> + ht2);> > }> }> |
出力
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {4=four, 6=six, 5=five} 3. ハッシュテーブル(int サイズ、float fillRatio): このバージョンでは、size で指定された初期サイズと fillRatio で指定されたフィル率を持つハッシュ テーブルが作成されます。フィル率: 基本的に、ハッシュ テーブルのサイズが上方に変更される前にハッシュ テーブルがどの程度満たされるかを決定し、その値は 0.0 から 1.0 の間になります。
ハッシュテーブル ht = new Hashtable(int size, float fillRatio);
ジャワ
// Java program to demonstrate> // adding elements to Hashtable> import> java.io.*;> import> java.util.*;> class> AddElementsToHashtable {> > public> static> void> main(String args[])> > {> > // No need to mention the> > // Generic type twice> > Hashtable ht1> > => new> Hashtable(> 4> ,> 0> .75f);> > // Initialization of a Hashtable> > // using Generics> > Hashtable ht2> > => new> Hashtable(> 3> ,> 0> .5f);> > // Inserting the Elements> > // using put() method> > ht1.put(> 1> ,> 'one'> );> > ht1.put(> 2> ,> 'two'> );> > ht1.put(> 3> ,> 'three'> );> > ht2.put(> 4> ,> 'four'> );> > ht2.put(> 5> ,> 'five'> );> > ht2.put(> 6> ,> 'six'> );> > // Print mappings to the console> > System.out.println(> 'Mappings of ht1 : '> + ht1);> > System.out.println(> 'Mappings of ht2 : '> + ht2);> > }> }> |
出力
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {6=six, 5=five, 4=four} 4.ハッシュテーブル(マップm): これにより、m の要素で初期化されたハッシュ テーブルが作成されます。
ハッシュテーブル ht = 新しいハッシュテーブル(マップ m);
ジャワ
// Java program to demonstrate> // adding elements to Hashtable> import> java.io.*;> import> java.util.*;> class> AddElementsToHashtable {> > public> static> void> main(String args[])> > {> > // No need to mention the> > // Generic type twice> > Map hm => new> HashMap();> > // Inserting the Elements> > // using put() method> > hm.put(> 1> ,> 'one'> );> > hm.put(> 2> ,> 'two'> );> > hm.put(> 3> ,> 'three'> );> > // Initialization of a Hashtable> > // using Generics> > Hashtable ht2> > => new> Hashtable(hm);> > // Print mappings to the console> > System.out.println(> 'Mappings of ht2 : '> + ht2);> > }> }> |
出力
Mappings of ht2 : {3=three, 2=two, 1=one} 例:
ジャワ
// Java program to illustrate> // Java.util.Hashtable> import> java.util.*;> public> class> GFG {> > public> static> void> main(String[] args)> > {> > // Create an empty Hashtable> > Hashtable ht => new> Hashtable();> > // Add elements to the hashtable> > ht.put(> 'vishal'> ,> 10> );> > ht.put(> 'sachin'> ,> 30> );> > ht.put(> 'vaibhav'> ,> 20> );> > // Print size and content> > System.out.println(> 'Size of map is:- '> + ht.size());> > System.out.println(ht);> > // Check if a key is present and if> > // present, print value> > if> (ht.containsKey(> 'vishal'> )) {> > Integer a = ht.get(> 'vishal'> );> > System.out.println(> 'value for key'> > +> ' 'vishal' is:- '> + a);> > }> > }> }> |
出力
Size of map is:- 3 {vaibhav=20, vishal=10, sachin=30} value for key 'vishal' is:- 10 ハッシュテーブルに対するさまざまな操作の実行
1. 要素の追加: 要素をハッシュテーブルに追加するには、put() メソッドを使用できます。ただし、広告掲載オーダーはハッシュテーブルには保持されません。内部的には、要素ごとに個別のハッシュが生成され、効率を高めるためにこのハッシュに基づいて要素にインデックスが付けられます。
ジャワ
// Java program to demonstrate> // adding elements to Hashtable> import> java.io.*;> import> java.util.*;> class> AddElementsToHashtable {> > public> static> void> main(String args[])> > {> > // No need to mention the> > // Generic type twice> > Hashtable ht1 => new> Hashtable();> > // Initialization of a Hashtable> > // using Generics> > Hashtable ht2> > => new> Hashtable();> > // Inserting the Elements> > // using put() method> > ht1.put(> 1> ,> 'Geeks'> );> > ht1.put(> 2> ,> 'For'> );> > ht1.put(> 3> ,> 'Geeks'> );> > ht2.put(> 1> ,> 'Geeks'> );> > ht2.put(> 2> ,> 'For'> );> > ht2.put(> 3> ,> 'Geeks'> );> > > // Print mappings to the console> > System.out.println(> 'Mappings of ht1 : '> + ht1);> > System.out.println(> 'Mappings of ht2 : '> + ht2);> > }> }> |
出力
Mappings of ht1 : {3=Geeks, 2=For, 1=Geeks} Mappings of ht2 : {3=Geeks, 2=For, 1=Geeks} 2. 要素の変更: 要素を追加した後、要素を変更したい場合は、put() メソッドを使用して要素を再度追加することで実行できます。ハッシュテーブル内の要素はキーを使用してインデックス付けされるため、変更したいキーの更新された値を挿入するだけでキーの値を変更できます。
ジャワ
// Java program to demonstrate> // updating Hashtable> import> java.io.*;> import> java.util.*;> class> UpdatesOnHashtable {> > public> static> void> main(String args[])> > {> > // Initialization of a Hashtable> > Hashtable ht> > => new> Hashtable();> > // Inserting the Elements> > // using put method> > ht.put(> 1> ,> 'Geeks'> );> > ht.put(> 2> ,> 'Geeks'> );> > ht.put(> 3> ,> 'Geeks'> );> > > // print initial map to the console> > System.out.println(> 'Initial Map '> + ht);> > > // Update the value at key 2> > ht.put(> 2> ,> 'For'> );> > > // print the updated map> > System.out.println(> 'Updated Map '> + ht);> > }> }> |
出力
Initial Map {3=Geeks, 2=Geeks, 1=Geeks} Updated Map {3=Geeks, 2=For, 1=Geeks} 3. 要素の削除: マップから要素を削除するには、remove() メソッドを使用できます。このメソッドはキー値を取得し、マップ内にキーが存在する場合はこのマップからキーのマッピングを削除します。
ジャワ
// Java program to demonstrate> // the removing mappings from Hashtable> import> java.io.*;> import> java.util.*;> class> RemovingMappingsFromHashtable {> > public> static> void> main(String args[])> > {> > // Initialization of a Hashtable> > Map ht> > => new> Hashtable();> > // Inserting the Elements> > // using put method> > ht.put(> 1> ,> 'Geeks'> );> > ht.put(> 2> ,> 'For'> );> > ht.put(> 3> ,> 'Geeks'> );> > ht.put(> 4> ,> 'For'> );> > // Initial HashMap> > System.out.println(> 'Initial map : '> + ht);> > // Remove the map entry with key 4> > ht.remove(> 4> );> > // Final Hashtable> > System.out.println(> 'Updated map : '> + ht);> > }> }> |
出力
Initial map : {4=For, 3=Geeks, 2=For, 1=Geeks} Updated map : {3=Geeks, 2=For, 1=Geeks} 4. ハッシュテーブルの走査: テーブルを反復するには、 高度な for ループ 。以下はハッシュテーブルを反復する例です。
ジャワ
// Java program to illustrate> // traversal of Hashtable> import> java.util.Hashtable;> import> java.util.Map;> public> class> IteratingHashtable {> > public> static> void> main(String[] args)> > {> > // Create an instance of Hashtable> > Hashtable ht => new> Hashtable();> > // Adding elements using put method> > ht.put(> 'vishal'> ,> 10> );> > ht.put(> 'sachin'> ,> 30> );> > ht.put(> 'vaibhav'> ,> 20> );> > > // Iterating using enhanced for loop> > for> (Map.Entry e : ht.entrySet())> > System.out.println(e.getKey() +> ' '> > + e.getValue());> > }> }> |
出力
vaibhav 20 vishal 10 sachin 30
ハッシュテーブルの内部動作
ハッシュテーブル データ構造は、キーと値のペアを格納するバケットの配列です。それは、 hashCode() メソッド キーと値のペアをマッピングする必要があるバケットを決定します。
ハッシュ関数は、バケット リスト内の特定のキーの場所を特定するのに役立ちます。一般に、ハッシュコードは非負の整数であり、等しいオブジェクトの場合は等しくなりますが、等しくないオブジェクトの場合は等しくなる場合もあれば、等しくない場合もあります。 2 つのオブジェクトが等しいかどうかを判断するために、hashtable は、equals() メソッドを使用します。
2 つの等しくないオブジェクトが同じハッシュコードを持つ可能性があります。これはと呼ばれます 衝突 。衝突を解決するために、hashtable はリストの配列を使用します。単一のバケット (配列インデックス) にマップされたペアはリストに保存され、リスト参照は配列インデックスに保存されます。
ハッシュテーブルのメソッド
- K – マップ内のキーのタイプ。
- で – マップ内にマッピングされる値のタイプ。
| 方法 | 説明 |
|---|---|
| クリア() | このハッシュテーブルをクリアして、キーが含まれないようにします。 |
| クローン() | このハッシュテーブルの浅いコピーを作成します。 |
| compute(K キー、BiFunction き、?スーパーV、? V> remappingFunction を拡張) | 指定されたキーとその現在のマップ値 (または、現在のマッピングがない場合は null) のマッピングの計算を試みます。 |
| computeIfAbsent(K キー, 関数 V> マッピング関数を拡張) | 指定されたキーがまだ値に関連付けられていない (または null にマップされている) 場合は、指定されたマッピング関数を使用してその値を計算し、null でない限りその値をこのマップに入力します。 |
| computeIfPresent(K キー、BiFunction remappingFunction) | 指定されたキーの値が存在し、null でない場合は、キーとその現在マップされている値を指定して新しいマッピングを計算しようとします。 |
| contains(オブジェクト値) | 一部のキーがこのハッシュテーブル内の指定された値にマップされるかどうかをテストします。 |
| containsKey(オブジェクトキー) | 指定されたオブジェクトがこのハッシュテーブルのキーであるかどうかをテストします。 |
| containsValue(オブジェクト値) | このハッシュテーブルが 1 つ以上のキーをこの値にマップする場合は true を返します。 |
| 要素() | このハッシュテーブル内の値の列挙を返します。 |
| エントリーセット() | このマップに含まれるマッピングの Set ビューを返します。 |
| 等しい(オブジェクト o) | Map インターフェースの定義に従って、指定されたオブジェクトとこの Map が等しいかどうかを比較します。 |
| get(オブジェクトキー) | 指定されたキーがマップされている値を返します。このマップにキーのマッピングが含まれていない場合は null を返します。 |
| ハッシュコード() | Map インターフェイスの定義に従って、この Map のハッシュ コード値を返します。 |
| isEmpty() | このハッシュテーブルが値にキーをマップしていないかどうかをテストします。 |
| キー() | このハッシュテーブル内のキーの列挙を返します。 |
| キーセット() | このマップに含まれるキーの Set ビューを返します。 |
| merge(Kキー、V値、BiFunctionリマッピング関数) | 指定されたキーがまだ値に関連付けられていない場合、または null に関連付けられている場合は、そのキーを指定された null 以外の値に関連付けます。 |
| put(Kキー、V値) | 指定されたキーをこのハッシュテーブル内の指定された値にマップします。 |
| putAll(マップt) | 指定されたマップからすべてのマッピングをこのハッシュテーブルにコピーします。 |
| リハッシュ() | エントリをより効率的に収容してアクセスするために、このハッシュテーブルの容量を増やし、内部的に再編成します。 |
| 削除 (オブジェクトキー) | このハッシュテーブルからキー (およびそれに対応する値) を削除します。 |
| サイズ() | このハッシュテーブル内のキーの数を返します。 |
| toString() | この Hashtable オブジェクトの文字列表現を、中かっこで囲まれ ASCII 文字 , (カンマとスペース) で区切られた一連のエントリの形式で返します。 |
| 値() | このマップに含まれる値のコレクション ビューを返します。 |
インタフェース java.util.Map で宣言されたメソッド
| 方法 | 説明 |
|---|---|
| forEach(BiConsumer アクション) | すべてのエントリが処理されるか、アクションが例外をスローするまで、このマップ内の各エントリに対して指定されたアクションを実行します。 |
| getOrDefault(オブジェクトキー, VdefaultValue) | 指定されたキーがマップされている値を返します。このマップにキーのマッピングが含まれていない場合は、defaultValue を返します。 |
| putIfAbsent (K キー、V 値) | 指定されたキーがまだ値に関連付けられていない (または null にマップされている) 場合は、そのキーを指定された値に関連付けて null を返し、それ以外の場合は現在の値を返します。 |
| 削除(オブジェクトキー、 オブジェクトの値) | 指定されたキーが現在指定された値にマップされている場合にのみ、指定されたキーのエントリを削除します。 |
| replace(Kキー、V値) | 指定されたキーが現在何らかの値にマップされている場合にのみ、そのキーのエントリを置き換えます。 |
| replace(K キー, V oldValue, V newValue) | 現在指定された値にマップされている場合にのみ、指定されたキーのエントリを置き換えます。 |
| replaceAll(BiFunction 関数) | すべてのエントリが処理されるか、関数が例外をスローするまで、各エントリの値をそのエントリに対して指定された関数を呼び出した結果に置き換えます。 |
必読:
- Java の HashMap と HashTable の違い
ハッシュテーブルの利点:
- スレッド セーフ: Hashtable クラスはスレッド セーフです。つまり、データの破損やその他の同期の問題を引き起こすことなく、複数のスレッドが同時にアクセスできます。
- 使い方が簡単: Hashtable クラスは使い方が簡単で、単純な場合に役立つ基本的なキーと値のデータ構造機能を提供します。
ハッシュテーブルの欠点:
- 廃止されました: Hashtable クラスは廃止されたとみなされ、その使用は一般に推奨されません。これは、コレクション フレームワークの導入前に設計されており、Map インターフェイスが実装されていないため、フレームワークの他の部分と組み合わせて使用することが困難になっているためです。
- 制限された機能: Hashtable クラスは、基本的なキーと値のデータ構造機能を提供しますが、Map インターフェイスとその実装で使用できる機能の全範囲を提供するわけではありません。
- パフォーマンスの低下: Hashtable クラスは同期されるため、HashMap や ConcurrentHashMap などの Map インターフェイスの他の実装と比較してパフォーマンスが低下する可能性があります。
参考書:
- Maurice Naftalin と Philip Wadler による Java コレクション。この本では、Hashtable クラスを含む Java コレクション フレームワークの包括的な概要を説明します。
- デビッド・フラナガン著「Java in a Nutshell」この本では、Hashtable クラスを含む Java のコア機能のクイック リファレンスを提供します。
- Java Generics and Collections (Maurice Naftalin および Philip Wadler 著)。この本は、Hashtable クラスを含む、Java のジェネリックスとコレクションに関する包括的なガイドを提供します。
参照: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Hashtable.html