Java HashMapの使い方

この記事のポイント

JavaのHashMapは、データを効率よく管理・検索するための仕組みです。

この記事を読むと、次のようなことが身に付きます。

  • キーと値をセットにしてデータを保存し、高速に検索する方法がわかる
  • データの追加、取得、削除などの基本操作を正しく使えるようになる
  • 実務でよく使われる便利なメソッドや、扱う際の注意点がわかる

Javaの開発現場で頻繁に使われるHashMapをマスターして、効率的なプログラムを作成できるようになりましょう。

目次

HashMapとは?

HashMapは、Javaで「キー」と「値」をペアにしてデータを管理するための便利な仕組みです。

日常生活にある辞書をイメージしてみてください。辞書では「単語」を調べると、その「意味」が書かれていますよね。HashMapも同じで、キー(単語)を指定することで、対応する値(意味)をすばやく取り出すことができます。

このように、特定の情報から関連したデータを引き出したいときに非常に役立つ道具です。

HashMapの特徴

  • キーと値をセットにしてデータを保存する
  • キーを指定するだけで大量のデータの中から目的の値を高速に見つけられる
  • 同じキーを重複して登録することはできず後から入れた値で上書きされる
  • キーや値にnull(空の状態)を入れることが認められている
  • データが格納される順番は決まっておらず取り出すたびに変わる可能性がある
  • 大量の情報を効率よく整理して検索や更新の処理をスムーズに行える

プログラムの中でデータのひも付けを管理し、必要な情報をすぐに取り出したい場面で欠かせない機能です。

【関連】
Javaをもっと詳しく学ぶならpaizaラーニング

基本構文

HashMapを使うには、まずjava.util.HashMapをインポートし、インスタンスを生成します。基本的な操作として、値の追加(put)、取得(get)、削除(remove)、サイズ確認(size)などのメソッドがあります。以下に代表的な基本構文を示します。

HashMapの生成と基本操作

import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("ネコ", 3); map.put("イヌ", 5); map.put("ウサギ", 2); System.out.println(map.get("ネコ")); System.out.println("サイズ: " + map.size()); } }

出力結果

3
サイズ: 3

この例では、HashMapを新しく作成し、動物の名前と数値をペアにして保存しています。まず、putメソッドを使って「キー」と「値」をセットで登録し、getメソッドにキーを渡すことで、対応する値を呼び出しています。sizeメソッドを使うと、現在どれだけのペアが格納されているかを簡単に調べられます。

キーの存在確認と条件分岐

指定したデータが登録されているかどうかを事前に調べる方法です。

import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); map.put("トラ", "大型ネコ科の動物"); if (map.containsKey("トラ")) { System.out.println("トラの説明: " + map.get("トラ")); } else { System.out.println("キーが見つかりませんでした"); } } }

出力結果

トラの説明: 大型ネコ科の動物

この例では、特定のキーがHashMapの中に含まれているかを判定しています。まず、containsKeyメソッドを使い、指定したキーが見つかった場合はtrue、見つからない場合はfalseを返します。登録されていないキーを呼び出すとnullが返ってくるため、事前にチェックを行うことで予期せぬエラーを防ぐことができます。

全要素の出力

HashMapに保存されているすべてのデータを一覧として表示する方法です。

import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("パンダ", 10); map.put("キリン", 4); map.put("ライオン", 7); for (String key : map.keySet()) { System.out.println(key + " -> " + map.get(key)); } } }

出力結果

パンダ -> 10
キリン -> 4
ライオン -> 7

※ 出力順は実行環境によって異なる場合があります

この例では、保存されているすべてのキーを順番に取り出して、それぞれの値と合わせて表示しています。まず、keySetメソッドですべてのキーを取得し、拡張for文を使って1つずつ処理しています。HashMapはデータの並び順を管理しないため、表示される順番は実行するたびに変わる場合があります。

実用例

ここからは、実際のプログラム開発でよく使われる便利な操作を紹介します。データの削除や上書き、初期値の設定方法など、基本を押さえたあとに役立つテクニックを確認していきましょう。

追加と取得

HashMapにデータを登録し、キーをもとに値を取り出す基本的な操作です。最初に覚えるべき基礎となるパターンです。

import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, String> animalSound = new HashMap<>(); animalSound.put("イヌ", "ワン"); animalSound.put("ネコ", "ニャー"); animalSound.put("カエル", "ケロケロ"); System.out.println("イヌの鳴き声: " + animalSound.get("イヌ")); System.out.println("ネコの鳴き声: " + animalSound.get("ネコ")); } }

出力結果

イヌの鳴き声: ワン
ネコの鳴き声: ニャー

この例では、動物の名前をキーに、その鳴き声を値として登録し、必要なときに対象の鳴き声を取り出しています。まず、putメソッドの第1引数にキー、第2引数に値を渡してデータをひも付けます。getメソッドを使えば、配列の添え字のように数値で指定するのではなく、文字列などのわかりやすい言葉でデータを管理できるのが特徴です。

削除と更新

登録済みのデータを削除したり、値を新しい内容に上書きしたりする操作です。データの管理では頻繁に使われます。

import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> ageMap = new HashMap<>(); ageMap.put("ゾウ", 15); ageMap.put("クマ", 8); ageMap.put("タヌキ", 3); ageMap.put("クマ", 9); ageMap.remove("タヌキ"); System.out.println("クマの年齢: " + ageMap.get("クマ")); System.out.println("タヌキ: " + ageMap.get("タヌキ")); } }

出力結果

クマの年齢: 9
タヌキ: null

この例では、特定の動物の年齢を更新したり、リストから除外したりしています。まず、すでに存在するキーに対して再びputを行うと、古い値が新しい値に自動的に書き換わります。データを消したいときはremoveメソッドにキーを渡します。削除されたあとのキーを指定してgetすると、データが存在しないことを示すnullが返ります。

全要素の繰り返し処理

HashMapに格納されたキーと値をセットで効率よく取り出し、すべてのデータを一括で処理する方法です。

import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { HashMap<String, Integer> weightMap = new HashMap<>(); weightMap.put("ゾウ", 5000); weightMap.put("ライオン", 180); weightMap.put("ペンギン", 5); for (Map.Entry<String, Integer> entry : weightMap.entrySet()) { System.out.println(entry.getKey() + "の体重: " + entry.getValue() + "kg"); } } }

出力結果

ゾウの体重: 5000kg
ライオンの体重: 180kg
ペンギンの体重: 5kg

※ 出力順は実行環境によって異なる場合があります

この例では、動物の名前と体重のペアをすべて取り出し、単位を付けて一覧表示しています。まず、entrySetメソッドを使うと、キーと値を1つのセットにした状態で取得できます。getKeyで名前、getValueで体重を一度に取り出せるため、大量のデータを扱う際に非常に効率的な書き方です。

キーまたは値の存在確認

特定のキーや値がHashMapの中に存在するかどうかを調べる方法です。データの有無によって処理を分けたい場合に使います。

import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, String> habitatMap = new HashMap<>(); habitatMap.put("シャチ", "海"); habitatMap.put("コアラ", "森"); habitatMap.put("サハラキツネ", "砂漠"); System.out.println("シャチがいるか: " + habitatMap.containsKey("シャチ")); System.out.println("「海」が値にあるか: " + habitatMap.containsValue("海")); System.out.println("カバがいるか: " + habitatMap.containsKey("カバ")); } }

出力結果

シャチがいるか: true
「海」が値にあるか: true
カバがいるか: false

この例では、特定の動物が登録されているか、また特定の生息地がデータの中に存在するかを調べています。まず、containsKeyは名前の通りキーを、containsValueは値を対象に検索を行います。結果は「はい(true)」か、「いいえ(false)」で返るため、データの有無によってプログラムの動きを切り替えるときに重宝します。

デフォルト値の取得

キーが存在しない場合に、nullの代わりにあらかじめ決めた初期値を返す方法です。nullによる予期せぬエラーを防ぐのに役立ちます。

import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> countMap = new HashMap<>(); countMap.put("カワウソ", 3); countMap.put("アザラシ", 7); int kawausoCount = countMap.getOrDefault("カワウソ", 0); int kitsneCount = countMap.getOrDefault("キツネ", 0); System.out.println("カワウソの数: " + kawausoCount); System.out.println("キツネの数: " + kitsneCount); } }

出力結果

カワウソの数: 3
キツネの数: 0

この例では、動物の数を数える際に、登録がない動物でもエラーにならないように処理しています。まず、getOrDefaultメソッドを使うと、第1引数のキーが見つからない場合、第2引数で指定した値を代わりに受け取れます。これにより、データがないときに突然プログラムが止まってしまうトラブルを未然に防ぐことができます。

ネストしたHashMapの使い方

HashMapの値として別のHashMapを格納する、ネスト(入れ子)構造の使い方です。2段階の分類が必要なデータを管理する際に活用できます。

import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, HashMap<String, Integer>> nested = new HashMap<>(); HashMap<String, Integer> catInfo = new HashMap<>(); catInfo.put("年齢", 4); catInfo.put("体重", 5); nested.put("ネコ", catInfo); System.out.println("ネコの年齢: " + nested.get("ネコ").get("年齢")); System.out.println("ネコの体重: " + nested.get("ネコ").get("体重") + "kg"); } }

出力結果

ネコの年齢: 4
ネコの体重: 5kg

この例では、動物の名前を大分類とし、その中にある「年齢」や「体重」といった詳細情報をさらに別のHashMapで細かく管理しています。まず、1つ目のgetで「ネコ」の情報が詰まった箱を取り出し、2つ目のgetでその中から具体的な数値を取り出しています。分類が必要な複雑なデータを整理するのに向いていますが、構造が複雑になりすぎないよう注意が必要です。

まとめ

要な機能です。この記事では、基本的な使い方から実用的な活用例まで解説しました。

HashMapが活用できるような場面は次のようなケースです。

HashMapが活躍する場面

  • ユーザーIDをキーにして、対応する情報をすばやく検索するとき
  • 単語の出現回数や数値の集計、グループ別のデータ管理を行うとき
  • 設定情報の項目名と設定値をペアにして動的に管理するとき

HashMapを用いる上で、押さえておきたいポイントを覚えておきましょう。

重要なポイント

  • 同じキーでデータを追加すると、古い値は新しい値に上書きされる
  • 存在しないキーを指定するとnullが返るため、事前確認や初期値の設定が有効
  • データの格納順序は保証されないため、順番が大切な場合はLinkedHashMapなど別のクラスを使う

プログラミング初心者の方も、まずは基本の操作から実際に書いて動かしてみてください。

名前やIDでデータを管理する手法は、実際の開発で非常に多く使われます。仕組みを理解しておけば、幅広いプログラムの作成に役立つはずです。

ぜひHashMapを使いこなして、より実用的なプログラムを作成できるようになりましょう。

レベルを更に上げたい方はpaizaプログラミングスキルチェック

  1. paizaラーニングトップ
  2. リファレンス
  3. Javaのリファレンス記事一覧
  4. Java HashMapの使い方