Mapに関するあれこれ

今回のお題

今回のお題は、JavaのMapです。

RubyのHashやPHP連想配列に相当する部分ですね。

目次

  • Mapとは何か
  • 変数宣言の仕方
  • 空のMapの作成
  • 要素の追加
  • 要素の出力・Map全体の出力
  • HashMap, TreeMap, LInkedTreeMapの違い

Mapとは何か

先ほども述べた通り、JavaのMapはRubyのHashやPHP連想配列などに相当します。

すなわち、キーと値をセットで管理するためのものですね。

 

例)
{ "1" = "大阪”, "2"="東京", "3"="名古屋" }

変数宣言の仕方

Javaの変数宣言には、変数名とデータ型をセットで記述するというルールがありました。

変数の中身がMapになる場合には、Mapのキーとバリューの型も記述するというルールに変わります。

 

例)

Map<String, String>prefectures

上記の例だと変数名がprefecture, データ型がMapでキーとバリューは共にString型ですね。

空のMapの作成

ちなみに、Mapについては変数の宣言と同時に中身を指定するということはあまりしません(既に出来上がっているMapを代入する場合を除く)。

一旦は空のMapを代入し、その中にキーとバリューのセットを追加していくという方法をとります。

空の配列については、HashMap, TreeMap, LInkedHashMapのいずれかのクラスを選択することになります。

 

Map<String, String>prefectures = new HashMap();

Map<String, String>prefectures = new TreeMap();

Map<String, String>prefectures = new LinkedHashMap();

 

この3つのクラスの違いについては後述します。

要素の追加

Javaにおいて、通常の配列に要素を追加する場合には

ary[] = xxx;

のような形で記述しました。

Mapの場合には、putメソッドを用いて追加します。

 

例)

prefectures.put("1", "大阪");

 

これで、prefecturesというMapに"1"というキーと"大阪”という配列がセットで追加されました。

要素の取得・配列全体の出力

要素の出力は、getメソッドを用いて行います。

System.put.println(prefectures.get("1"));

//結果:"大阪"

getメソッドの引数としてMapのキーの値を与えると、それに対応したバリューが戻るというわけですね。

 

ちなみに、Map全体を出力すると以下のようになります。

System.out.println(prefectures);

結果:{"1"="大阪", "2"="東京", ......}

HashMap, TreeMap, LinkedTreeMapの違い

先ほど、Mapには3つのクラスがあると述べました。

では、それらの違いは一体なんなのでしょうか?

一言で言えば、それぞれのキーとバリューのセットの順番の管理の仕方が違います。

 

  • HashMapは要素ごとの順番を管理しない。for文で順番に取り出した場合に、ランダムに出力される。
  • TreeMapは、キーが昇順になるように順番を管理す流。for文で展開する際にも、キーが小さいものから出力される。
  • LinkedHashMapは、要素を追加した順番で管理される。for文で展開される場合には、早くに追加したものから順に出力される。

 

例えば、以下のように要素を追加したとします。

prefectures.put("5", "神奈川");

prefectures.put("3", "愛知");

 

このMapをfor文で展開した場合、TreeMapであれば愛知が先に来ますが、LinkedHashMapであれば神奈川が先に来ます。