2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Javaの配列のCloneについて整理する

Last updated at Posted at 2024-03-20

1次元配列

1次元配列arrayAを作成する。

jshell> int[] arrayA = {1, 2, 3, 4}
arrayA ==> int[4] { 1, 2, 3, 4 }

このときのイメージはこちら。
image.png

arrayAをcloneして別の1次元配列arrayBを作成する。

jshell> int[] arrayB = arrayA.clone()
arrayB ==> int[4] { 1, 2, 3, 4 }

このときのイメージはこちら。
image.png


arrayAとarrayBは別のものであることを確認できる。

jshell> arrayA == arrayB
$9 ==> false

※ '==' 演算子は同一性(等値性)を検証する演算子である。(同値性(等価性)ではない)
参照型変数に '==' 演算子を適用する場合、左右のオペランドが同じ変数への参照をもっている場合、trueになる。
上記の例ではarrayAとarrayBは別の変数(インスタンス)への参照をもっているため、falseとなる。


arrayAとarrayBの参照先はそれぞれ別の配列であるため、片方の配列要素を変更してももう片方の要素は変更されない。
jshell> arrayB
arrayB ==> int[4] { 1, 2, 3, 4 }

jshell> arrayB[0] = 9
$13 ==> 9

jshell> arrayB
arrayB ==> int[4] { 9, 2, 3, 4 }

jshell> arrayA
arrayA ==> int[4] { 1, 2, 3, 4 }

image.png

2次元配列

2次元配列arrayAを作成する。

jshell> int[][] arrayA = { {20, 30, 40}, {50, 60, 70, 80}}
arrayA ==> int[2][] { int[3] { 20, 30, 40 }, int[4] { 50, 60, 70, 80 } }

image.png


arrayAをcloneして別の2次元配列arrayBを作成する。

jshell> int[][] arrayB = arrayA.clone()
arrayB ==> int[2][] { int[3] { 20, 30, 40 }, int[4] { 50, 60, 70, 80 } }

image.png


arrayAとarrayBは別のものであることを確認できる。

jshell> arrayA == arrayB
$36 ==> false

一方、arrayA[1]とarrayB[1]は同じものであることを確認できる。 (両方2544番地の配列を参照している)
jshell> arrayA[1] == arrayB[1]
$37 ==> true

もちろんarrayA[1][0]とarrayB[1][0]も同じである。
jshell> arrayA[1][0] == arrayB[1][0]
$38 ==> true

ここで新たに1次元配列arrayCを作成する。
jshell> int[] arrayC = { 90, 100}
arrayC ==> int[2] { 90, 100 }

さらにarrayB[1]の参照先配列をarrayCに変更してみよう。

jshell> arrayB[1] = arrayC
$39 ==> int[2] { 90, 100 }

image.png


arrayA[1]とarrayB[1]がそれぞれ異なる配列を参照するようになる。

jshell> arrayA[0] == arrayB[0]
$40 ==> true

jshell> arrayA[1] == arrayB[1]
$41 ==> false

arrayB[0]をcloneしてarrayDを作成してみよう。
jshell> int[] arrayD = arrayB[0].clone()
arrayD ==> int[3] { 20, 30, 40 }

image.png


arrayB[0]とarrayDは別物である。

jshell> arrayB[0] == arrayD
$42 ==> false

arrayD[1]を変更してみる。

jshell> arrayD[1] = 999
$42 ==> 999

jshell> arrayD
arrayD ==> int[3] { 20, 999, 40 }

image.png


arrayA[0]やarrayB[0]にはもちろん影響がない。
jshell> arrayA[0]
$45 ==> int[3] { 20, 30, 40 }

jshell> arrayB[0]
$46 ==> int[3] { 20, 30, 40 }

理解度チェック

こちらの記事の冒頭の問題に挑戦してみてほしい。
https://qiita.com/TaikiTkwkbysh/items/f427911ec023b8012778

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?