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

## 1次元配列
1次元配列arrayAを作成する。
```java:
jshell> int[] arrayA = {1, 2, 3, 4}
arrayA ==> int[4] { 1, 2, 3, 4 }
```
このときのイメージはこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531112/561f34d6-af74-129a-cd8a-a14bc72fa303.png)
<br>

arrayAをcloneして別の1次元配列arrayBを作成する。
```java:
jshell> int[] arrayB = arrayA.clone()
arrayB ==> int[4] { 1, 2, 3, 4 }
```
このときのイメージはこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531112/f57db279-6b67-2d80-ee4e-db1cf57099e6.png)
<br>
arrayAとarrayBは別のものであることを確認できる。
```java:
jshell> arrayA == arrayB
$9 ==> false
```
※ '==' 演算子は同一性(等値性)を検証する演算子である。(同値性(等価性)ではない)
参照型変数に '==' 演算子を適用する場合、左右のオペランドが同じ変数への参照をもっている場合、trueになる。
上記の例ではarrayAとarrayBは別の変数(インスタンス)への参照をもっているため、falseとなる。

<br>
arrayAとarrayBの参照先はそれぞれ別の配列であるため、片方の配列要素を変更してももう片方の要素は変更されない。

```java:
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531112/df67679e-0547-360f-2633-bc04dedfdfce.png)
<br>
## 2次元配列
2次元配列arrayAを作成する。
```java:
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531112/23fd8b1f-3e30-d052-5a49-bdccb5b217a3.png)
<br>
arrayAをcloneして別の2次元配列arrayBを作成する。
```java:
jshell> int[][] arrayB = arrayA.clone()
arrayB ==> int[2][] { int[3] { 20, 30, 40 }, int[4] { 50, 60, 70, 80 } }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531112/f9ef1bed-004e-f61c-15ce-1dd77bd8c0a5.png)
<br>
arrayAとarrayBは別のものであることを確認できる。
```java:
jshell> arrayA == arrayB
$36 ==> false
```
<br>
一方、arrayA[1]とarrayB[1]は同じものであることを確認できる。
(両方2544番地の配列を参照している)

```java:
jshell> arrayA[1] == arrayB[1]
$37 ==> true
```
<br>
もちろんarrayA[1][0]とarrayB[1][0]も同じである。

```java:
jshell> arrayA[1][0] == arrayB[1][0]
$38 ==> true
```

<br>
ここで新たに1次元配列arrayCを作成する。

```java:
jshell> int[] arrayC = { 90, 100}
arrayC ==> int[2] { 90, 100 }
```

さらにarrayB[1]の参照先配列をarrayCに変更してみよう。
```java:
jshell> arrayB[1] = arrayC
$39 ==> int[2] { 90, 100 }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531112/2236aeee-40b5-8bd4-2440-ca92bdc48f13.png)
<br>
arrayA[1]とarrayB[1]がそれぞれ異なる配列を参照するようになる。
```java:
jshell> arrayA[0] == arrayB[0]
$40 ==> true

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

<br>
arrayB[0]をcloneしてarrayDを作成してみよう。

```java:
jshell> int[] arrayD = arrayB[0].clone()
arrayD ==> int[3] { 20, 30, 40 }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531112/376573a4-3443-5d3e-2722-f45ce824bafe.png)
<br>
arrayB[0]とarrayDは別物である。
```java:
jshell> arrayB[0] == arrayD
$42 ==> false
```
arrayD[1]を変更してみる。

```java:
jshell> arrayD[1] = 999
$42 ==> 999

jshell> arrayD
arrayD ==> int[3] { 20, 999, 40 }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531112/2d110240-3273-f06b-2e49-6b973251770b.png)

<br>
arrayA[0]やarrayB[0]にはもちろん影響がない。

```java:
jshell> arrayA[0]
$45 ==> int[3] { 20, 30, 40 }

jshell> arrayB[0]
$46 ==> int[3] { 20, 30, 40 }
```
## 理解度チェック
こちらの記事の冒頭の問題に挑戦してみてほしい。
https://qiita.com/TaikiTkwkbysh/items/f427911ec023b8012778