JavaでMapをコピーする方法を現役エンジニアが解説【初心者向け】

初心者向けにJavaでMapをコピーする方法について解説しています。複数の値を扱うデータ型のひとつMapの宣言方法と要素の追加方法、Mapをコピーする場合の書き方、注意点について学びましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事が4,000以上あります。現役エンジニアの方はこちらをご覧ください。

JavaでMapをコピーする方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。

 

Javaについてそもそもよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まるでしょう。

 

なお本記事は、TechAcademyのオンラインブートキャンプJava講座の内容をもとに作成しています。

 

田島悠介

今回は、Javaに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

Mapをコピーする方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

目次

 

Mapとは

Map型は、「キー」と「値」を1セットとして、複数のデータを保持することのできるデータ型のことです。

似たようなデータ型として、配列やList型などの複数の値を保持することのできるデータ型が用意されており、Map型には「キー」があることが大きな違いです。

 

Map型を宣言するには、Hashmapクラスを用いて、キーのデータ型と値のデータ型を指定して初期化します。

Map<キーの型名, 値の型名> オブジェクト名 = new HashMap<>();

 

要素を追加したい場合は、putメソッドを用いて、好きなキーとそれに対応する値を追加することができます。

オブジェクト名.put(キー, 値)

 

 

[PR] Javaで挫折しない学習方法を動画で公開中

Mapをコピーする時の注意点

Map型をコピーするときの注意点は、コピーの種類が2つあるという点です。

2つの異なるコピーとして、「ディープコピー」と「シャローコピー」があります。

ディープコピーでは、もとのMap型のデータのみがコピーされます。

データのみをコピーするため、コピー元とコピー先のMap型は別物です。

 

一方、シャローコピーでは、もとのMap型の参照先をコピーします。

参照先をコピーすることによって、コピー元のMap型を変更すると、それがコピー先のMap型に反映されるコピーがシャローコピーの特徴です。

ディープコピーでは、コピー元とコピー先のデータが必ずしも一致しないものの、シャローコピーでは、コピー元とコピー先のデータが必ず一致します。

 

Mapをコピーする方法

Map型をコピーする方法としては、ディープコピーの場合は、Map型に付属するメソッドを利用します。

Map型.clone()

もしくは、コンストラクタにもとのMap型を代入しましょう。

new HashMap<>(もとのMap型)

 

一方、シャローコピーの場合は、単純にそのまま代入すれば大丈夫です。

Map<キーの型名, 値の型名> 新しいMapオブジェクト = コピー元のMap型

 

実際に書いてみよう

実際にコードを書いてみて、振る舞いを確認してみましょう。

import java.util.HashMap;
import java.util.Map;
import java.lang.Integer;

public class MapCopy{
                 public static void main(String[] args){
                 Map<Integer, String> map1 = new HashMap<>();
                 map1.put(0,"Japan");
                 map1.put(1,"America");
                 map1.put(2,"China");

                Map<Integer, String> deepMap = new HashMap<>(map1);
                 Map<Integer, String> shallowMap = map1;

                System.out.println("もとのMap(変更前)");
                 for (Integer key : map1.keySet()){System.out.printf("%d : %s",key, map1.get(key));}
                 System.out.println();

                map1.put(2,"Korea");
                 System.out.println("もとのMap(変更後)");
                 for (Integer key : map1.keySet()){System.out.printf("%d : %s",key, map1.get(key));}
                 System.out.println();

                System.out.println("ディープコピーしたMap");
                 for (Integer key : deepMap.keySet()){System.out.printf("%d : %s",key, deepMap.get(key));}
                 System.out.println();

                System.out.println("シャローコピーしたMap");
                 for (Integer key : shallowMap.keySet()){System.out.printf("%d : %s",key, shallowMap.get(key));}
         }
}

これを実行すると、

もとのMap(変更前)
0 : Japan1 : America2 : China
もとのMap(変更後)
0 : Japan1 : America2 : Korea
ディープコピーしたMap
0 : Japan1 : America2 : China
シャローコピーしたMap
0 : Japan1 : America2 : Korea

と表示されて、ディープコピーの場合にはもとのMapの変更が反映されず、シャローコピーの場合にのみ反映されていることが確認できます。

 

まとめ

この記事では、Map型のコピーの方法と、ディープコピー、シャローコピーについて解説しました。

参照のコピーなのか、データのコピーなのかを意識するという点が大事なので、覚えておくと今後役に立つと思います。

 

執筆してくれたメンター

小倉翔悟 (おぐらしょうご)

AIプログラミングを使って開発を行う大学3年生。

プログラミング歴は約3年。

Pythonは割と好きな方。

JavaもAndroid開発で触れていたりする。

大学では物理学を勉強中。

好きな物理理論は一般相対性理論らしい。

意外と動物が好きだったり、、、。

 

大石ゆかり

JavaでMapをコピーする方法がよく分かったので良かったです!

田島悠介

ゆかりちゃん、これからも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

TechAcademyでは、初心者でも最短4週間で、JavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプを開催しています。

また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。