Java HashMap完全マスター:操作、実例、ベストプラクティス
Java HashMapをマスターする
JavaのHashMapクラスの核心機能、一般的な操作、実践的な例を通じて、実世界のアプリケーションで自信を持って使用できるように解説します。
Javaコレクションフレームワークの一部であるHashMapクラスは、キー/値ペアでデータを格納するハッシュテーブルを実装します。各キーは一意であり、関連する値の識別子として機能します。このクラスはMapインターフェースを実装し、データ操作のための多機能なAPIを提供します。

HashMapの作成
java.util.HashMapパッケージをインポートして始めます:
import java.util.HashMap;
その後マップをインスタンス化。ジェネリックキー型Kと値型Vを指定するか、型推論に任せます:
HashMap<K, V> numbers = new HashMap<>();
具体的型での例:
HashMap<String, Integer> numbers = new HashMap<>();
例1:基本的なHashMap作成
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<String, Integer> languages = new HashMap<>();
languages.put("Java", 8);
languages.put("JavaScript", 1);
languages.put("Python", 3);
System.out.println("HashMap: " + languages);
}
}
出力
HashMap: {Java=8, JavaScript=1, Python=3}
HashMapの主要操作
HashMapクラスは豊富なメソッドセットを提供します。最も頻繁に使用されるものを以下にカバーします:
- 要素の追加
- 要素へのアクセス
- 要素の更新
- 要素の削除
1. 要素の追加
put()でキー/値ペアを挿入。キーが既に存在する場合、値が置換されます。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<String, Integer> numbers = new HashMap<>();
System.out.println("初期HashMap: " + numbers);
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("put()後のHashMap: " + numbers);
}
}
出力
初期HashMap: {}
put()後のHashMap: {One=1, Two=2, Three=3}
この例ではキー:String、値:Integerです。
2. 要素へのアクセス
get(key)で値を取得。キーが存在しない場合はnullを返します。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
String value = languages.get(1);
System.out.println("キー1の値: " + value);
}
}
出力
HashMap: {1=Java, 2=Python, 3=JavaScript}
キー1の値: Java
keySet()、values()、entrySet()で完全なキーセット、値コレクション、エントリセットも取得できます:
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
System.out.println("Keys: " + languages.keySet());
System.out.println("Values: " + languages.values());
System.out.println("Entries: " + languages.entrySet());
}
}
出力
HashMap: {1=Java, 2=Python, 3=JavaScript}
Keys: [1, 2, 3]
Values: [Java, Python, JavaScript]
Entries: [1=Java, 2=Python, 3=JavaScript]
3. 値の更新
replace(key, newValue)メソッドは、指定キーの既存値を置換します。古い値を返し、キーが存在しなければnullを返します。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("元のHashMap: " + languages);
languages.replace(2, "C++");
System.out.println("replace()後: " + languages);
}
}
出力
元のHashMap: {1=Java, 2=Python, 3=JavaScript}
replace()後: {1=Java, 2=C++, 3=JavaScript}
4. 要素の削除
remove(key)でマッピングを削除し、削除された値を返します。条件付き削除にはremove(key, value)を使用し、現在のマッピングが指定値と一致する場合のみ削除します。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
String removed = languages.remove(2);
System.out.println("削除された値: " + removed);
System.out.println("更新後のHashMap: " + languages);
}
}
出力
HashMap: {1=Java, 2=Python, 3=JavaScript}
削除された値: Python
更新後のHashMap: {1=Java, 3=JavaScript}
その他のHashMapメソッド
| メソッド | 説明 |
|---|---|
| clear() | すべてのマッピングを削除 |
| compute() | キーの新しい値を計算 |
| computeIfAbsent() | キーが欠落している場合のみ値を計算 |
| computeIfPresent() | キーが存在する場合のみ値を計算 |
| merge() | 既存マッピングと新しいマッピングをマージ |
| clone() | シャローコピーを作成 |
| containsKey() | 特定キーの存在確認 |
| containsValue() | 特定値の存在確認 |
| size() | キー/値ペアの数 |
| isEmpty() | マップが空かどうか |
HashMapのイテレーション
for-eachループでキー、値、エントリを走査します。エントリイテレーションにはjava.util.Map.Entryをインポートします。
import java.util.HashMap;
import java.util.Map.Entry;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
System.out.print("Keys: ");
for (Integer key : languages.keySet()) {
System.out.print(key + ", ");
}
System.out.print("\nValues: ");
for (String value : languages.values()) {
System.out.print(value + ", ");
}
System.out.print("\nEntries: ");
for (Entry<Integer, String> entry : languages.entrySet()) {
System.out.print(entry + ", ");
}
}
}
出力
HashMap: {1=Java, 2=Python, 3=JavaScript}
Keys: 1, 2, 3,
Values: Java, Python, JavaScript,
Entries: 1=Java, 2=Python, 3=JavaScript,
別のMapからHashMapを作成
既存マップの内容でHashMapをインスタンス化します:
import java.util.HashMap;
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> evenNumbers = new TreeMap<>();
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
System.out.println("TreeMap: " + evenNumbers);
HashMap<String, Integer> numbers = new HashMap<>(evenNumbers);
numbers.put("Three", 3);
System.out.println("HashMap: " + numbers);
}
}
出力
TreeMap: {Four=4, Two=2}
HashMap: {Two=2, Three=3, Four=4}
オプションのコンストラクタパラメータで初期容量と負荷係数を設定できます:
HashMap<K, V> numbers = new HashMap<>(8, 0.6f);
- 容量:リハッシュ前の8エントリ
- 負荷係数:60%でリサイズトリガー
デフォルトはcapacity = 16、load factor = 0.75です。
より深い理解のためには、公式JavaドキュメントやJoshua Bloch著「Effective Java」などの信頼できるリソースを参照してください。
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java if…elseをマスター:制御フローを徹底解説
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Java Vectorの理解:使い方、特徴、ArrayListとの比較