what is hashmap java
このJavaHashMapチュートリアルでは、JavaでのHashMapとは何かとその使用方法について説明します。 HashMapの宣言、初期化、反復、実装、印刷の方法が含まれています。
JavaのHashMapは、Mapに基づくコレクションであり、キーと値のペアで構成されています。 HashMapはまたはで示されます。 HashMap要素には、キーを使用してアクセスできます。つまり、HashMap要素にアクセスするにはキーを知っている必要があります。
HashMapは、「ハッシュ」と呼ばれる手法を使用します。ハッシュでは、アルゴリズムまたは「ハッシュ関数」を適用することにより、長い文字列が短い文字列に変換されます。文字列は、検索が高速になるため、短い文字列に変換されます。また、効率的なインデックス作成にも使用されます。
=> 独占的なJavaトレーニングチュートリアルシリーズについては、こちらをご覧ください。
学習内容:
JavaのHashMap
HashMapはHashTableに似ていますが、HashMapが同期されておらず、キーと値にnull値を許可する点が異なります。
HashMapの重要な特性のいくつかを以下に示します。
- HashMapは、java.utilパッケージの一部である「Hashmap」クラスでJavaに実装されています。
- HashMapクラスは、Mapインターフェースを部分的に実装するクラス「AbstractMap」を継承します。
- HashMapは、「クローン可能」および「シリアル化可能」インターフェースも実装します。
- HashMapは重複する値を許可しますが、重複するキーは許可しません。 HashMapは複数のnull値も許可しますが、nullキーは1つだけにすることができます。
- HashMapは同期されておらず、要素の順序も保証されません。
- Java HashMapクラスの初期容量は16で、デフォルトの(初期)負荷係数は0.75です。
JavaでHashMapを宣言する方法は?
JavaのHashMapは、java.utilパッケージの一部です。したがって、コードでHashMapを使用する必要がある場合は、最初に次のステートメントのいずれかを使用して実装クラスをインポートする必要があります。
import java.util.*;
または
import java.util.HashMap;
HashMapクラスの一般的な宣言は次のとおりです。
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
ここで、K =>マップに存在するキーのタイプ
V =>マップ内のキーにマップされた値のタイプ
HashMapを作成する
JavaのHashMapは、次のように作成できます。
import java.util.HashMap; HashMap cities_map = new HashMap ();
上記のステートメントには、最初にJavaのHashMapクラスが含まれています。次に、次のステートメントで、キータイプを整数、値を文字列として「cities_map」という名前のHashMapを作成します。
HashMapを作成したら、値で初期化する必要があります。
ハッシュマップを初期化する方法は?
マップにいくつかの値を置くことにより、putメソッドを使用してHashMapを初期化できます。
以下のプログラムは、JavaでのHashMapの初期化を示しています。
import java.util.*; class Main{ public static void main(String args[]){ //create a HashMap and print HashMap colorsMap=new HashMap(); System.out.println('Initial Map: '+colorsMap); //put some initial values into it using put method colorsMap.put(100,'Red'); colorsMap.put(101,'Green'); colorsMap.put(102,'Blue'); //print the HashMap System.out.println('After adding elements:'); for(Map.Entry m:colorsMap.entrySet()){ System.out.println(m.getKey()+' '+m.getValue()); } } }
出力:
初期マップ:{}
要素を追加した後:
100ネットワーク
101グリーン
102ブルー
HashMapは内部でどのように機能しますか?
HashMapはキーと値のペアのコレクションであり、「ハッシュ」と呼ばれる手法を利用していることがわかっています。内部的には、HashMapはノードの配列です。 HashMapは、キーと値のペアを格納するために配列とLinkedListを利用します。
以下に示すのは、プログラムでクラスとして表されるHashMapのノードの構造です。
上記のノード表現からわかるように、ノードはリンクリストノードに似た構造を持っています。これらのノードの配列はバケットと呼ばれます。各バケットの容量は同じではない場合があり、複数のノードを持つこともできます。
HashMapのパフォーマンスは、次の2つのパラメーターの影響を受けます。
(i)初期容量: 容量は、HashMapのバケット数として定義されます。初期容量は、HashMapオブジェクトが作成されたときの容量として定義されます。 HashMapの容量は常に2倍されます。
(ii)LoadFactor: LoadFactorは、再ハッシュ(容量の増加)が行われるときに測定するパラメーターです。
容量が大きい場合、再ハッシュが不要になるため、負荷率が小さくなることに注意してください。同様に、容量が少ない場合は、頻繁に再ハッシュする必要があるため、負荷率が高くなります。したがって、効率的なハッシュマップを設計するには、これら2つの要素を慎重に選択するように注意する必要があります。
HashMapを反復する方法は?
キーと値のペアを操作または印刷するには、HashMapをトラバースする必要があります。
HashMapをトラバースまたは反復する方法は2つあります。
- forループの使用
- whileループとイテレータを使用します。
以下のJavaプログラムは、これら両方のメソッドの実装を示しています。
まず、entrySetメソッドを使用してHashMapからエントリのセットを取得し、次にforループを使用してセットをトラバースします。次に、getKey()メソッドとgetValue()メソッドをそれぞれ使用して、キーと値のペアを出力します。
whileループを使用してHashMapをトラバースするには、最初にHashMapのイテレーターを設定してから、イテレーターを使用してキーと値のペアにアクセスします。
import java.util.*; public class Main{ public static void main(String [] args) { //create a HashMap and initialize it HashMap cities_map = new HashMap(); cities_map.put(10, 'MUM'); cities_map.put(1, 'DL'); cities_map.put(20, 'PUN'); cities_map.put(7, 'GOA'); cities_map.put(3, 'HYD'); //print using for loop System.out.println('HashMap using for Loop:'); System.out.println(' KEY VALUE'); for (Map.Entry mapSet : cities_map.entrySet()) { System.out.println(' '+mapSet.getKey() + ' ' + mapSet.getValue()); } //print using while loop with iterator System.out.println('HashMap using while Loop:'); System.out.println(' KEY VALUE'); Iterator iterator = cities_map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry mapSet2 = (Map.Entry) iterator.next(); System.out.println(' '+mapSet2.getKey() + ' ' + mapSet2.getValue()); } } }
出力:
forループを使用するHashMap:
キーバリュー
1 DL
3長い
20駄洒落
7 GOA
10 MUM
whileループを使用したHashMap:
キーバリュー
1 DL
3長い
20駄洒落
7 GOA
10 MUM
ハッシュマップを印刷する
以下のプログラムに示すforeachループを使用してhashMapを印刷する別の例を見てみましょう。
import java.util.HashMap; public class Main { public static void main(String[] args) { // create a HashMap and initialize HashMap colors = new HashMap(); colors.put('Red', 1); colors.put('Orange', 5); colors.put('Magenta', 8); //print the HashMap System.out.println('HashMap contents:'); System.out.println(' KEY VALUE'); for (String i : colors.keySet()) { System.out.println(' ' + i + ' ' + colors.get(i)); } } }
出力:
HashMapの内容:
キーバリュー
ネットワーク1
マゼンタ8
オレンジ5
JavaのHashMapコンストラクター/メソッド
以下の表は、JavaのHashMapクラスによって提供されるコンストラクターとメソッドを示しています。
コンストラクター
コンストラクタープロトタイプ | 説明 | |
---|---|---|
putAll | void putAll(マップマップ) | 指定された「マップ」要素をHashMapに挿入します。 |
HashMap() | デフォルトのコンストラクタ。 | |
HashMap(マップm) | 指定されたマップオブジェクトmから新しいHashMapを作成します。 | |
HashMap(int容量) | 引数「capacity」で指定された初期容量を使用して、新しいHashMapを作成します。 | |
HashMap(int容量、float loadFactor) | コンストラクターによって提供されたcapacityとloadFactorの値を使用して、新しいHashMapを作成します。 |
メソッド
方法 | メソッドプロトタイプ | 説明 |
---|---|---|
晴れ | ボイドクリア() | HashMapのすべてのマッピングをクリアします |
isEmpty | ブールisEmpty() | HashMapが空かどうかを確認します。はいの場合はtrueを返します。 |
クローン | オブジェクトクローン() | HashMapのキーと値のマッピングを複製せずに、浅いコピーを返します。 |
entrySet | エントリセット()を設定します | HashMapのマッピングをコレクションとして返します |
キーセット | キーセットを設定する() | HashMapのキーのセットを返します。 |
置く | V put(オブジェクトキー、オブジェクト値) | HashMapにKey-Valueエントリを挿入します。 |
putIfAbsent | V putIfAbsent(Kキー、V値) | 指定されたキーと値のペアがまだ存在しない場合は、HashMapに挿入します。 |
削除する | V削除(オブジェクトキー) | 指定されたキーのエントリをHashMapから削除します。 |
削除する | boolean remove(オブジェクトキー、オブジェクト値) | 指定されたキーと値のペアをHashMapから削除します。 |
計算する | V計算(Kキー、BiFunction remappingFunction) | 指定されたキーとその現在の値またはnull値の「remappingfunction」を使用してマッピングを計算します。 |
方法 | メソッドプロトタイプ | 説明 |
computeIfAbsent | V computeIfAbsent(Kキー、関数mappingFunction) | 「mappingFunction」を使用してマッピングを計算し、キーと値のペアがまだ存在しないかnullの場合は挿入します。 |
computeIfPresent | V computeIfPresent(Kキー、BiFunction remappingFunction) | キーがすでに存在し、null以外の場合、キーを指定して「remappingFunction」を使用して新しいマッピングを計算します。 |
containsValue | ブールcontainsValue(オブジェクト値) | 指定された値がHashMapに存在するかどうかを確認し、存在する場合はtrueを返します。 |
containsKey | ブールcontainsKey(オブジェクトキー) | 指定されたキーがHashMapに存在するかどうかを確認し、存在する場合はtrueを返します。 |
等しい | ブール値が等しい(オブジェクトo) | 指定されたオブジェクトをHashMapと比較します。 |
forEach | void forEach(BiConsumerアクション) | HashMapの各エントリに対して指定された「アクション」を実行します。 |
取得する | V get(オブジェクトキー) | 指定されたキーと関連する値を含むオブジェクトを返します。 |
getOrDefault | V getOrDefault(オブジェクトキー、V defaultValue) | 指定されたキーがマップされている値を返します。マップされていない場合は、デフォルト値を返します。 |
isEmpty | ブールisEmpty() | HashMapが空かどうかを確認します。 |
行く | Vマージ(Kキー、V値、BiFunction remappingFunction) | 指定されたキーがnullであるか、値に関連付けられていないかを確認し、remappingFunctionを使用してnull以外の値に関連付けます。 |
交換 | V置換(Kキー、V値) | 指定されたキーの指定された値を置き換えます。 |
交換 | ブール置換(Kキー、V oldValue、V newValue) | 指定されたキーの古い値を新しい値に置き換えます |
replaceAll | void replaceAll(BiFunction関数) | 指定された関数を実行し、HashMapのすべての値を関数の結果に置き換えます。 |
値 | コレクションvalues() | HashMapに存在する値のコレクションを返します。 |
サイズ | intサイズ() | HashMapのエントリ数のサイズを返します。 |
ハッシュマップの実装
次に、これらの関数のほとんどをJavaプログラムに実装して、それらの機能をよりよく理解します。
次のJavaプログラムは、JavaでのHashMapの実装を示しています。上で説明したほとんどの方法を使用したことに注意してください。
import java.util.*; public class Main { public static void main(String args[]) { HashMap hash_map = new HashMap(); hash_map.put(12, 'Leo'); hash_map.put(2, 'Seville'); hash_map.put(7, 'Lacy'); hash_map.put(49, 'Lily'); hash_map.put(3, 'Dillon'); System.out.println('HashMap contents:'); System.out.println(' KEY VALUE'); //display HashMap contents Set setIter = hash_map.entrySet(); Iterator map_iterator = setIter.iterator(); while(map_iterator.hasNext()) { Map.Entry map_entry = (Map.Entry)map_iterator.next(); System.out.println(' '+ map_entry.getKey() + ' ' + map_entry.getValue()); } //get value for the given key String var= hash_map.get(2); System.out.println('Value at index 2 is: '+var); //delete value given the key hash_map.remove(3); System.out.println('Hashmap after removal:'); System.out.println(' KEY VALUE'); Set iter_set = hash_map.entrySet(); Iterator iterator = iter_set.iterator(); while(iterator.hasNext()) { Map.Entry mentry = (Map.Entry)iterator.next(); System.out.println(' '+mentry.getKey() + ' ' + mentry.getValue() ); } } }
出力:
HashMapの内容:
キーバリュー
49リリー
2セビリア
3ディロン
7レイシー
12レオ
インデックス2の値は次のとおりです。セビリア
削除後のハッシュマップ:
キーバリュー
49リリー
2セビリア
7レイシー
12レオ
JavaでHashMapを並べ替える
Javaでは、HashMapは順序を保持しません。したがって、HashMapの要素を並べ替える必要があります。キーまたは値に基づいて、HashMapの要素を並べ替えることができます。このセクションでは、両方の並べ替え方法について説明します。
HashMapをキーで並べ替える
import java.util.*; public class Main { public static void main(String[] args) { //create and initialize a HashMap HashMap colors_map = new HashMap(); colors_map.put(9, 'Magenta'); colors_map.put(11, 'Yellow'); colors_map.put(7, 'Cyan'); colors_map.put(23, 'Brown'); colors_map.put(5, 'Blue'); colors_map.put(3, 'Green'); colors_map.put(1, 'Red'); //print the unsorted HashMap by getting a set and using iterator System.out.println('Unsorted HashMap:'); Set set = colors_map.entrySet(); Iterator iterator = set.iterator(); while(iterator.hasNext()) { Map.Entry me = (Map.Entry)iterator.next(); System.out.print(me.getKey() + ': '); System.out.println(me.getValue()); } //create a treemap from given HashMap so that the keys are sorted Map map = new TreeMap(colors_map); System.out.println('HashMap Sorted on keys:'); //print the sorted HashMap Set set2 = map.entrySet(); Iterator iterator2 = set2.iterator(); while(iterator2.hasNext()) { Map.Entry me2 = (Map.Entry)iterator2.next(); System.out.print(me2.getKey() + ': '); System.out.println(me2.getValue()); } } }
出力:
ソートされていないHashMap:
1:ネットワーク
3:緑
5:青
7:シアン
23:ブラウン
9:マゼンタ
11:黄色
キーでソートされたHashMap:
1:ネットワーク
3:緑
5:青
7:シアン
9:マゼンタ
11:黄色
23:ブラウン
上記のプログラムでは、ハッシュマップが定義され、値が入力されると、このハッシュマップからツリーマップが作成されることがわかります。ハッシュマップがツリーマップに変換されると、そのキーは自動的にソートされます。したがって、このツリーマップを表示すると、キーでソートされたマップが取得されます。
HashMapを値で並べ替える
値に従ってHashMapをソートするために、最初にハッシュマップをLinkedListに変換します。次に、Collections.sortメソッドをコンパレータとともに使用して、リストを並べ替えます。次に、このリストはHashMapに変換されます。ソートされたHashMapが出力されます。
import java.util.*; public class Main { public static void main(String[] args) { //Create and initialize the HashMap HashMap colors_map = new HashMap(); colors_map.put(5, 'B'); colors_map.put(11, 'O'); colors_map.put(3, 'I'); colors_map.put(13, 'R'); colors_map.put(7, 'G'); colors_map.put(1, 'V'); colors_map.put(9, 'Y'); //print the HashMap using iterator after converting to set System.out.println('Unsorted HashMap:'); Set set = colors_map.entrySet(); Iterator iterator = set.iterator(); while(iterator.hasNext()) { Map.Entry map_entry = (Map.Entry)iterator.next(); System.out.print(map_entry.getKey() + ': '); System.out.println(map_entry.getValue()); } //call sortByValues method that returns a sorted Map. Map c_map = sortByValues(colors_map); System.out.println('HashMap sorted on values:'); //print the sorted HashMap Set set2 = c_map.entrySet(); Iterator iterator2 = set2.iterator(); while(iterator2.hasNext()) { Map.Entry map_entry2 = (Map.Entry)iterator2.next(); System.out.print(map_entry2.getKey() + ': '); System.out.println(map_entry2.getValue()); } } private static HashMap sortByValues(HashMap hash_map) { //create a LinkedList from HashMap List list = new LinkedList(hash_map.entrySet()); // use Collections.sort method with Comparator to sort the list Collections.sort(list, new Comparator() { public int compare(Object o1, Object o2) { return ((Comparable) ((Map.Entry) (o1)).getValue()) .compareTo(((Map.Entry) (o2)).getValue()); } }); //create a HashMap from linkedlist which preserves the order HashMap sortedHashMap = new LinkedHashMap(); for (Iterator it = list.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); sortedHashMap.put(entry.getKey(), entry.getValue()); } return sortedHashMap; } }
出力:
ソートされていないHashMap:
1:V
3:私
5:B
7:G
9:および
11:O
13:R
値でソートされたHashMap:
5:B
7:G
3:私
11:O
13:R
1:V
9:および
Javaでの同時HashMap
通常のHashMapでは、実行時または反復の実行中に要素を変更することはできません。
並行マップの実装を以下に示します。
import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class Main { public static void main(String[] args) { //declare and initialize ConcurrentHashMap Map cCMap = new ConcurrentHashMap(); cCMap.put('1', '10'); cCMap.put('2', '10'); cCMap.put('3', '10'); cCMap.put('4', '10'); cCMap.put('5', '10'); cCMap.put('6', '10'); //print the initial ConcurrentHashMap System.out.println('Initial ConcurrentHashMap: '+cCMap); //define the iterator over the keys of ConcurrentHashMap Iterator it = cCMap.keySet().iterator(); //change one of the keys using iterator while(it.hasNext()){ String key = it.next(); if(key.equals('3')) cCMap.put(key+'c_map', 'c_map'); } //print the changed ConcurrentHashMap System.out.println('
ConcurrentHashMap after iterator: '+cCMap); } }
出力:
初期ConcurrentHashMap:{1 = 10、2 = 10、3 = 10、4 = 10、5 = 10、6 = 10}
イテレータ後のConcurrentHashMap:{1 = 10、2 = 10、3 = 10、4 = 10、5 = 10、6 = 10、3c_map = c_map}
Chromeでswfを実行する方法
HashMapで同じ操作を実行した場合、ConcurrentModificationExceptionがスローされることに注意してください。
JavaマップとHashMap
JavaのMapとHashMapの違いのいくつかを表にまとめてみましょう。
地図 | HashMap |
---|---|
これは抽象的なインターフェースです。 | Mapインターフェースの実装です。 |
その機能を利用できるようにするには、インターフェイスを他のクラスで実装する必要があります。 | 具体的なクラスであり、機能を取得するためにクラスオブジェクトを作成できます。 |
TreeMapのようなマップインターフェイスの実装では、null値は許可されません。 | null値とキーを許可します。 |
TreeMapは重複する値を許可しません。 | 値が重複する可能性があります。 |
オブジェクトの自然な順序が維持されます。 | HashMapでは入力順序は維持されません。 |
よくある質問
Q#1)JavaでHashMapが使用されるのはなぜですか?
回答: キーと値のペアのコレクションであるHashMapは、キーのみに基づいてデータを検索するのに役立ちます。また、ハッシュ手法を使用しているため、データの効率的なルックアップを提供します。
Q#2)ハッシュマップをどのように作成しますか?
回答: HashMapは、java.utilパッケージの「HashMap」クラスをインスタンス化することで作成できます。整数型のキーと文字列型の値を持つhashMapは、次のように作成できます。
HashMap myMap= new HashMap();
Q#3)HashMapはJavaで注文されていますか?
回答: いいえ、HashMapはJavaでは順序付けられていません。 Javaではその目的で使用されませんが、要素をキーと値のペアで格納するために使用されます。
Q#4)HashMapはスレッドセーフですか?
回答: いいえ、hashMapはJavaではスレッドセーフではありません。
Q#5)HashMapとConcurrentHashMapのどちらが速いですか?
回答: HashMapはConcurrentHashMapよりも高速です。その理由は、HashMapは通常1つのスレッドでのみ動作するため、パフォーマンスが良好であるためです。ただし、同時HashMapは、その名前が示すように同時であり、複数のスレッドで同時に機能します。
結論
このチュートリアルでは、ConcurrentHashMapと呼ばれるHashMapの別のバリエーションとともにHashMapの動作を理解しました。 HashMapのコンストラクター、メソッド、および例を見てきました。また、ConcurrentHashMapとその例についても説明しました。
今後のチュートリアルでは、Javaコレクションについて詳しく学習します。
=> ここでJavaトレーニングチュートリアルのA〜Zを確認するには、ここをクリックしてください。