スライドショー

【Java入門】MapのkeySetの意味と使い方

JavaのMap使う上で、keySetメソッドを使用した便利な使い方があるのはご存知でしょうか?

Mapのキー一覧を取得したい
keySetの基本的な使い方が知りたい
keySetを扱うときの注意点は?

今回は、そんな悩みを解決するためにkeySetメソッドの使い方を、わかりやすく解説します!

keySetの使いかた

keySetメソッドは、Mapインタフェースの変数に対して使用し、Mapに含まれるキーのset値を返します。ここではkeySetメソッドの基本文法と、実際の使い方を説明します。

基本文法

keySetメソッドは、以下のように使用します。

Map.keySet()

以下のサンプルでは、Mapに対して、keySetメソッドを使用して、キー値を取得しています。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        
        // Mapの宣言
        Map<Integer, String> mMap1 = new HashMap<Integer, String>();
        
        // Mapにデータを格納
        mMap1.put( 1, "apple");
        mMap1.put( 2, "orange");
        mMap1.put( 3, "melon");
        
        // keySetを使用して、キーを取得する
        Set<Integer> MapSet = mMap1.keySet();
        
        // Setインタフェースの変数MapSetの値を確認
        for (Iterator<Integer> n = MapSet.iterator(); n.hasNext();)
        {
            System.out.println(n.next());
        }
    }
}

実行結果

1
2
3

keySetメソッドを使用すれば、putメソッドで追加したMapのset値が返却されます。keySetメソッドで取得したMapSetの中身をループで確認すると、Mapのキー値が取得できていることがわかります。

実際の使い方

基本文法で説明した通り、keySetメソッドを使用すれば、Mapのセット値が取得できます。そのため、Mapに追加した値全てに対して処理を行いたいときに、keySetメソッドを利用すると便利です。

以下に実際の使い方を記述します。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        
        // Mapの宣言
        Map<Integer, String> mMap1 = new HashMap<Integer, String>();
        
        // Mapにデータを格納
        mMap1.put( 1, "apple");
        mMap1.put( 2, "orange");
        mMap1.put( 3, "melon");
        
        // keySetを使用してMapの要素数分ループする
        for (Integer nKey : mMap1.keySet())
        {
            System.out.println(mMap1.get(nKey));
        }
    }
}

実行結果

apple
orange
melon

紹介したサンプルでは、Mapインタフェースの変数mMap1を宣言し、putメソッドを使用して値を追加しています。次にmMap1に対してkeySetメソッドを使用し、拡張for文で順次値を取り出しています。

keySetを扱う上での注意点

keySetは、シャローコピーによって値が保持されるメソッドです。シャローコピーとは、浅いコピーの意味合いで使われ、コピー元のオブジェクトと、コピー先のオブジェクトの参照しているデータが、同じであることを意味します。

つまり、コピー元のオブジェクトが参照している値が変更されると、コピー先の値も変更されてしまいます。以下に、keySetでSet値を取得後に、コピー元のMapに値を追加した場合のサンプルを記述します。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        
        // Mapの宣言
        Map<String, String> mMap1 = new HashMap<String, String>();
        
        // Mapにデータを格納
        mMap1.put( "key1", "apple");
        mMap1.put( "key2", "orange");
        mMap1.put( "key3", "melon");
        
        // keySetを使用して、キーを取得する
        Set<String> MapSet = mMap1.keySet();
        
        // Mapにさらにデータを格納
        mMap1.put( "key4", "pineapple");
        
         // ループでSetインタフェースの変数MapSetの値を確認
        for (Iterator<String> s = MapSet.iterator(); s.hasNext();)
        {
            System.out.println(s.next());
        }
    }
}

実行結果

key1
key2
key3
key4

紹介したサンプルでは、Mapインタフェースの変数mMap1を宣言し、putメソッドを使用して値を追加しています。次にmMap1に対してkeySetメソッドを使用し、Set値を取得しています。

その後、putメソッドを使用して、さらにMapにデータを追加しています。keySetで取得したSetインタフェースの変数MapSetの値をループで確認すると、keySetメソッドでSet値を取得した後に、putメソッドで追加した”key4”の値も、MapSetに追加されていることがわかります。

前述したように、keySetメソッドを使用して値を取得後に、Mapの内容を変更してしまうと、keySetで返却したSet値も変更されてしまいます。

そのため、安易にkeySetを使用すると、その後のMap操作(追加・削除など)により値が増減してしまうため、予期せぬ不具合が発生してしまうこともありえます。keySetを使用するときは、keySetはシャローコピーであることを、十分意識して使うようにしましょう。

Mapについてもっと詳しく知りたい方へ

Mapのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

まとめ

MapのkeySetメソッドの基本文法や実際の使い方、注意点などを説明しました。keySetメソッドは、Mapの値をループで取得するときなどに便利ですが、使い方を誤ると不具合が発生する原因となりますので、内容はしっかりと覚えておきましょう。

もし、keySetの使い方を忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部としてこれまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。