この記事ではListをコピーする方法をわかりやすく解説します!
「Listをコピーする方法を知りたい」
「ディープコピーとシャローコピーの違いを知りたい」
「cloneメソッドの使い方を知りたい」
今回はそんな悩みを解決するListのコピーについてです。
なお、Javaの記事については、こちらにまとめています。
Listをコピーする方法
ディープコピーとシャローコピーとは
初めにディープコピーとシャローコピーについて解説します。
シャローコピーはオブジェクトの参照先をコピーするので、コピー元のListとコピー先のListが同じデータを参照します。
そのため、シャローコピーでは片方の値を変更すると、もう片方の値も同じように変更されるので、2つのListは同じ値を持つListになります。
ディープコピーは参照先のデータまでコピーするので、コピー元のListとコピー先のListが別々の値を持つListになります。
ディープコピーが値渡し、シャローコピーが参照渡しをするイメージです。
ディープコピーをする方法
次にディープコピーをする方法を解説します。
ディープコピーをするには、インスタンスを生成するときのコンストラクタの引数にコピー元のListを指定します。
cloneメソッドを使ってListをコピーすることもできます。
次のプログラムで確認してみましょう。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { ArrayList<String> list1 = new ArrayList<>(); list1.add("a"); list1.add("b"); list1.add("c"); ArrayList<String> list2 = new ArrayList<>(list1); ArrayList<String> list3 = (ArrayList<String>) list1.clone(); list1.set(0, "x"); list2.set(1, "y"); list3.set(2, "z"); System.out.println("コピー元のList"); for (String s : list1) { System.out.println(s); } System.out.println("コピー先のList"); for (String s : list2) { System.out.println(s); } System.out.println("cloneメソッドでコピーしたList"); for (String s : list3) { System.out.println(s); } } }
[実行結果] コピー元のList x b c コピー先のList a y c cloneメソッドでコピーしたList a b z
コピー元のListを変更しても、コピー先のListが変更されない別々の値を持つListが作成されることが確認できました!
シャローコピーをする方法
最後にシャローコピーをする方法を解説します。
シャローコピーは新しくインスタンスを生成せずに、Listを代入して行います。
次のプログラムで確認してみましょう。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { ArrayList<String> list1 = new ArrayList<>(); list1.add("a"); list1.add("b"); list1.add("c"); ArrayList<String> list2 = list1; list1.set(0, "x"); list2.set(1, "y"); System.out.println("コピー元のList"); for (String s : list1) { System.out.println(s); } System.out.println("コピー先のList"); for (String s : list2) { System.out.println(s); } } }
[実行結果] コピー元のList x y c コピー先のList x y c
コピー元のListを変更すると、コピー先のListも変更される同じ値を持つListが作成されることが確認できました!
範囲を指定してコピーする方法
Listの範囲を指定してコピーする方法はこちらの記事を参考にしてください!
Listと配列を変換する方法
Listと配列を変換する方法はこちらの記事を参考にしてください!
まとめ
いかがでしたか?
今回はListをコピーする方法について解説しました。
ディープコピーとシャローコピーを間違えると、思い通りのデータにならないので注意してくださいね。
もしListのコピーについて忘れてしまったらこの記事を確認してください!