1次元配列
1次元配列arrayAを作成する。
jshell> int[] arrayA = {1, 2, 3, 4}
arrayA ==> int[4] { 1, 2, 3, 4 }
arrayAをcloneして別の1次元配列arrayBを作成する。
jshell> int[] arrayB = arrayA.clone()
arrayB ==> int[4] { 1, 2, 3, 4 }
このときのイメージはこちら。
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 }
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 } }
arrayAをcloneして別の2次元配列arrayBを作成する。
jshell> int[][] arrayB = arrayA.clone()
arrayB ==> int[2][] { int[3] { 20, 30, 40 }, int[4] { 50, 60, 70, 80 } }
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 }
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 }
jshell> arrayB[0] == arrayD
$42 ==> false
arrayD[1]を変更してみる。
jshell> arrayD[1] = 999
$42 ==> 999
jshell> arrayD
arrayD ==> int[3] { 20, 999, 40 }
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