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

初心者向けにJavaでListをコピーする方法について解説しています。最初に複数の値を扱うデータ型のひとつListの基本と定義方法を説明します。次にListをコピーするときの書き方と注意点を見ていきましょう。

TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

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

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

 

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

 

田島悠介

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

大石ゆかり

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

田島悠介

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

大石ゆかり

お願いします!

 

目次

 

Listとは

まずは、List型について簡単に説明しておきます。List型というのは、複数の値を保持することのできるデータ型です。同じように複数の値を保持できるデータ型として、通常の変数を使って

int[]

などで定義できる配列などもありますが、List型には複数のデータに対して使える便利なメソッドが用意されています。

List型の定義は次のように行ないます。

List<データ型名> オブジェクト名 = new ArrayList<データ型名>();

List型は複数の値を保持することができると言っても、データ型は同じである必要があり、初期化のときに指定しておく必要があります。

 

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

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

List型のコピーに関する注意点としては、コピーの種類として2つのものがあるという点です。List型は、「ディープコピー」と「シャローコピー」があり、

  • ディープコピー:もとのList型のデータのみがコピーされる
  • シャローコピー:もとのList型の参照先をコピーする

これらの違いは、シャローコピーして新しく作られたList型の値は、もとのList型を変更すると同じように変更される、という点です。

 

Listをコピーする方法

List型のコピーでは、ディープコピーの場合は、List型に付属するメソッド

List型.clone()

を利用します。もしくは、コンストラクタにもとのList型を代入して、

new ArrayList<データ型名>(もとのList型)

シャローコピーの場合は、そのまま代入します。

List<データ型名> 新しいList = コピー元のList型

 

実際に書いてみよう

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

import java.util.ArrayList;
import java.util.List;
import java.lang.Integer;

public class ListCopy{
        public static void main(String[] args){

                //コピーされるリストの初期化
                 List<Integer> list1 = new ArrayList<Integer>();
                 list1.add(0);
                 list1.add(1);
                 list1.add(2);

                //リストのコピー
                List<Integer> deepList = new ArrayList<Integer>(list1);
                 List<Integer> shallowList = list1;

                System.out.println("もとのリスト(変更前)");
                 for (int i : list1){System.out.println(i);}
 
                //リストの変更
                list1.set(0,3);
                 System.out.println("もとのリスト(変更後)");
                 for (int i : list1){System.out.println(i);}

                System.out.println("ディープコピーしたリスト");
                 for (int i : deepList){System.out.println(i);}

                System.out.println("シャローコピーしたリスト");
                 for (int i : shallowList){System.out.println(i);}
         }
}

これを実行すると、

もとのリスト(変更前)
0
1
2
もとのリスト(変更後)
3
1
2
ディープコピーしたリスト
0
1
2
シャローコピーしたリスト
3
1
2

と表示されて、ディープコピーではコピー元のリストに対する変更が反映されず、シャローコピーではコピー元のリストに対する変更が反映されることが確認できます。

 

まとめ

この記事では、JavaにおけるList型のコピー方法について解説しました。

コピーの仕方で、コピーもとの変更が反映されるかどうか、というところが大事なポイントです。List型以外のコピーでも時折出てくるところなので覚えておくと良いと思います。

 

監修してくれたメンター

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

AIプログラミングを使って開発を行う大学3年生。プログラミング歴は約3年。Pythonは割と好きな方。JavaもAndroid開発で触れていたりする。

大学では物理学を勉強中。好きな物理理論は一般相対性理論らしい。

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

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

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

大石ゆかり

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

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

 

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