HashMapとは何か
JavaのHashMapは、キーと値のペアを格納するためのデータ構造です。これは、Javaのjava.utilパッケージに含まれるMapインターフェースの一部です。
HashMapは、キーと値のペアを格納するためのハッシュテーブルを使用します。各キーはハッシュ関数によって一意のハッシュコードに変換され、このハッシュコードは値を格納するためのバケットを決定します。
HashMapの主な特性は以下の通りです:
– キーの一意性:HashMapでは、各キーは一意でなければなりません。同じキーで新しい値を挿入すると、既存の値が更新されます。
– nullキーとnull値:HashMapは一つのnullキーと任意の数のnull値を許容します。
– 順序なし:HashMapは要素の挿入順序を保持しません。これは、要素がハッシュ関数によって決定されるバケットに格納されるためです。
これらの特性により、HashMapは高速な検索と更新操作を提供します。これは、キーに基づいて直接値を取得または更新できるためです。これがHashMapが広く使用される理由の一つです。しかし、順序を保持する必要がある場合は、LinkedHashMapやTreeMapのような他のMap実装を検討することもあります。これらは、要素の挿入順序またはキーの自然な順序を保持します。しかし、これらの操作はHashMapよりもわずかに遅いかもしれません。これは、順序情報を保持するための追加のオーバーヘッドがあるためです。
HashMapのインスタンスの作成
JavaのHashMapのインスタンスを作成するには、以下のようにnew
キーワードとともにHashMap
コンストラクタを使用します。
HashMap<String, Integer> map = new HashMap<>();
このコードは、キーがString
型で値がInteger
型の新しいHashMapインスタンスを作成します。
また、HashMapのコンストラクタは、初期容量と負荷係数を指定するオプションも提供しています。初期容量は、HashMapが格納できる要素の数を指定します。負荷係数は、HashMapが再ハッシュ(内部データ構造の再構築)を行うタイミングを制御します。これらのパラメータを指定するには、以下のようにします。
HashMap<String, Integer> map = new HashMap<>(10, 0.5f);
このコードは、初期容量が10で負荷係数が0.5の新しいHashMapインスタンスを作成します。しかし、これらのパラメータは通常、デフォルトの値(初期容量:16、負荷係数:0.75)で十分です。これらの値を変更すると、HashMapのパフォーマンスとメモリ使用量に影響を与える可能性があるため、注意が必要です。具体的な値を設定する前に、アプリケーションの要件とこれらのパラメータがどのようにHashMapの動作に影響を与えるかを理解することが重要です。
キーと値のペアをマップに追加する方法
JavaのHashMapにキーと値のペアを追加するには、put
メソッドを使用します。以下にその使用例を示します。
HashMap<String, Integer> map = new HashMap<>();
map.put("Apple", 10);
map.put("Banana", 20);
map.put("Cherry", 30);
このコードは、新しいHashMapインスタンスを作成し、それに3つのエントリ(キーと値のペア)を追加します。各エントリは、フルーツの名前(String
型のキー)とその数量(Integer
型の値)を表します。
put
メソッドは、指定したキーがマップにすでに存在する場合、そのキーの既存の値を新しい値で置き換えます。そして、置き換えられた旧の値を返します。指定したキーがマップにまだ存在しない場合、put
メソッドはnull
を返します。
Integer oldValue = map.put("Apple", 15);
このコードは、キー"Apple"
の値を10
から15
に更新します。そして、put
メソッドは更新前の値10
を返します。
これらの特性により、put
メソッドは、新しいエントリの追加と既存エントリの更新の両方を行うことができます。これが、HashMapがキーと値のペアを効率的に管理できる理由の一つです。しかし、指定したキーが存在しない場合だけ新しいエントリを追加したい場合は、putIfAbsent
メソッドを使用することもあります。これについては、次のセクションで詳しく説明します。
既存のキーに新しい値を設定する方法
JavaのHashMapでは、既存のキーに新しい値を設定するためにput
メソッドを使用します。このメソッドは、指定したキーがマップにすでに存在する場合、そのキーの既存の値を新しい値で置き換えます。そして、置き換えられた旧の値を返します。
以下にその使用例を示します。
HashMap<String, Integer> map = new HashMap<>();
map.put("Apple", 10);
Integer oldValue = map.put("Apple", 20);
このコードは、まずキー"Apple"
と値10
のペアをマップに追加します。次に、同じキー"Apple"
で新しい値20
を挿入します。このとき、put
メソッドは更新前の値10
を返します。
この特性により、put
メソッドは既存エントリの更新を行うことができます。しかし、新しいエントリの追加と既存エントリの更新の両方を行うため、指定したキーが存在しない場合だけ新しいエントリを追加したい場合は、putIfAbsent
メソッドを使用することもあります。これについては、次のセクションで詳しく説明します。
指定したキーが存在しない場合だけキーと値のペアを追加する方法
JavaのHashMapでは、指定したキーが存在しない場合だけキーと値のペアを追加するためにputIfAbsent
メソッドを使用します。このメソッドは、指定したキーがマップにまだ存在しない場合にのみ、新しいエントリを追加します。
以下にその使用例を示します。
HashMap<String, Integer> map = new HashMap<>();
map.put("Apple", 10);
map.putIfAbsent("Apple", 20);
このコードは、まずキー"Apple"
と値10
のペアをマップに追加します。次に、同じキー"Apple"
で新しい値20
を挿入しようとします。しかし、このキーはすでにマップに存在するため、putIfAbsent
メソッドは何も行いません。
putIfAbsent
メソッドは、指定したキーがマップにすでに存在する場合、そのキーの現在の値を返します。指定したキーがマップにまだ存在しない場合、putIfAbsent
メソッドはnull
を返します。
Integer currentValue = map.putIfAbsent("Banana", 20);
このコードは、キー"Banana"
がマップにまだ存在しないため、新しいエントリを追加します。そして、putIfAbsent
メソッドはnull
を返します。
これらの特性により、putIfAbsent
メソッドは、指定したキーが存在しない場合だけ新しいエントリを追加することができます。これは、新しいエントリの追加と既存エントリの更新を区別する必要がある場合に便利です。しかし、新しいエントリの追加と既存エントリの更新の両方を行うためには、put
メソッドを使用します。これについては、前のセクションで詳しく説明しました。
マップに追加されているキーと値のペアの数を取得する方法
JavaのHashMapでは、マップに追加されているキーと値のペアの数を取得するためにsize
メソッドを使用します。このメソッドは、マップに現在格納されているエントリの数を返します。
以下にその使用例を示します。
HashMap<String, Integer> map = new HashMap<>();
map.put("Apple", 10);
map.put("Banana", 20);
map.put("Cherry", 30);
int size = map.size(); // size will be 3
このコードは、まず新しいHashMapインスタンスを作成し、それに3つのエントリ(キーと値のペア)を追加します。次に、size
メソッドを使用してマップのサイズ(エントリの数)を取得します。この場合、size
メソッドは3
を返します。
これらの特性により、size
メソッドは、マップに格納されているエントリの数を効率的に取得することができます。これは、マップの容量を管理するために便利です。しかし、マップが空であるかどうかを確認するためには、isEmpty
メソッドを使用します。これについては、次のセクションで詳しく説明します。
指定したキーとペアの値を取得する方法
JavaのHashMapでは、指定したキーに関連付けられた値を取得するためにget
メソッドを使用します。このメソッドは、指定したキーがマップに存在する場合、そのキーの値を返します。指定したキーがマップに存在しない場合、get
メソッドはnull
を返します。
以下にその使用例を示します。
HashMap<String, Integer> map = new HashMap<>();
map.put("Apple", 10);
map.put("Banana", 20);
map.put("Cherry", 30);
Integer appleCount = map.get("Apple"); // appleCount will be 10
Integer grapeCount = map.get("Grape"); // grapeCount will be null
このコードは、まず新しいHashMapインスタンスを作成し、それに3つのエントリ(キーと値のペア)を追加します。次に、get
メソッドを使用してキー"Apple"
と"Grape"
の値を取得します。キー"Apple"
はマップに存在するため、get
メソッドは10
を返します。一方、キー"Grape"
はマップに存在しないため、get
メソッドはnull
を返します。
これらの特性により、get
メソッドは、指定したキーに関連付けられた値を効率的に取得することができます。これは、キーと値のペアを検索するために便利です。しかし、指定したキーがマップに存在するかどうかを確認するためには、containsKey
メソッドを使用します。これについては、次のセクションで詳しく説明します。