【配列の作成と使用】

## はじめに
オラクル認定資格教科書 Javaプログラマ Silver SE８
第一章　Javaの基本　
第二章　Javaのデータ型の操作
第三章　演算子と判定構造の使用
第四章　配列の作成と使用←　ｲﾏｺｺ！！
第五章　ループ構造の使用
第六章　メソッドとカプセル化の操作
第七章　継承の操作
第八章　例外の処理
第九章　Java APIの主要なクラスの操作
## 配列の概要
配列は複数の値（要素と呼ぶ）を一つにまとめて扱うためのインスタンスである
以下の２つの特徴がある
・同じ型、もしくは互換性のある型の値しか扱えない
・扱える要素数はインスタンス生成時に決める
## 配列の生成
配列を使うには、newキーワードで配列のインスタンスを生成する必要がある
```java
//配列インスタンスの生成、配列型変数への代入
int[] array = new int[3];
```
#### 配列インスタンスの生成
```java
//配列インスタンスの生成
new int[3];
```
配列インスタンスの生成時、必ず整数値で要素数を指定しなければならない
`int[] array = new int[0]`のように要素数０でも指定可能
#### 配列型変数の宣言
```java
//配列型変数の宣言
int[] array;
```
配列型変数の宣言で大括弧「[]」を使って配列型であることを示すが、
この大括弧は変数名の後ろにも記述できる→`int array[];`
#### 配列要素の初期化
配列インスタンスを生成した直後、配列の要素には以下の値がデフォルトで入っている
|型|デフォルト値|
|:--|:--|
|整数型|0|
|浮動小数点数型|0.0|
|真偽型|false|
|文字型|¥u0000|
|オブジェクト型|null|

インスタンスの生成と初期化を同時にする場合は初期化演算子「{}」を使用する
```java
//newしなくてもインスタンスが生成される
int[] array = {10, 20, 30}
//new使ってもいいけれど、[]内に要素数を指定してはいけない
int[] array = new int[]{2, 4}
```
## 多次元配列
配列にほかの配列への参照を持っていることを「２次元配列」、「３次元配列」〜「多次元配列」という
```java
int[][] arrayA = new int[3][3]
```
#### 多次元配列インスタンスの生成
通常の配列同様、生成時に要素数を指定する必要がある
ただし、１次元目のみ必須であり、２次元以降は以下のように一次元の要素に代入する形で後から生成できる
```java
int[][] array = new int[3][];//２次元配列
array[0] = new int[2]
array[1] = new int[3]
array[2] = new int[5]
//２次元目以降は要素数を揃える必要はない
```
#### 多次元配列の宣言
```java
int[][] arrayA;//２次元配列
int[][] arrayA[];//３次元配列_大カッコは型名と変数名双方の後ろに記載できる
```
#### 初期化演算子を率いた配列の生成・宣言・初期化
```java
int[][] array = {};
int[][] array = {{2, 3}, {4, 5}};
int[][] array = new int[][]{};
//２行に分ける場合
int[][] array;
array = new int[][]{};
```
※初期化演算子を使う場合、[]内で要素数を指定してはいけない

## 配列のコピー
#### cloneメソッド
cloneメソッドはコピー対象の配列と同じ値を持つインスタンスを新たに生成しており、厳密にはコピーではない
多次元配列の場合、一次元目は新インスタンスだが、２次元目以降はコピー元と同じ参照である
```java
int arrayA = {1, 2, 3, 4};
int[] arrayB = arrayA.clone();
System.out.println(arrayA == array B);
//結果: false　(arrayBに代入されているものはarrayAを複製した新インスタンスのため参照が異なる)
for (int i ; arrayB) {
  System.out.println(i);//結果: 1 2 3 4
}
```
#### arraycopyメソッド
cloneメソッドは配列の一部を切り出してのコピーができないが、arraycopeでは指定してコピーできる
`System.arraycopy(コピー元配列, コピー開始位置（０から）, コピー先配列, コピー先置き換え開始位置（０から）, コピーしてくる要素の数)`
```java
int arrayA = {1, 2, 3, 4, 5};
int[] arrayB = new int[5];
System.arraycopy(arrayA, 1, arrayB, 0, 4);
for (int i ; arrayB) {
  System.out.println(i);//結果: 2 3 4 5
}
```

## リンク集
[【Javaの基本①】クラスの構造](https://qiita.com/vitamin_b12/items/3f920cd223fd3cc1ceae)
[【Javaの基本②】パッケージとインポート](https://qiita.com/vitamin_b12/items/be766c8c3ef2366d9fea)
[【継承の操作②】インターフェース](https://qiita.com/vitamin_b12/items/cdc76298d7f6a494dff2)
[【Javaのデータ型の操作①】プリミティブ型のデータ・参照型](https://qiita.com/vitamin_b12/items/f922ab56e4d8b6580f49)
[【演算子と判定構造の使用①】論理演算子(&&、||)、同一性（==）、同値性(equals)](https://qiita.com/vitamin_b12/items/9feb89e8fb1bc67a8d6d)
[【演算子と判定構造の使用②】分岐処理(if、swich)](https://qiita.com/vitamin_b12/items/523467908e683474eac7)
[【配列の作成と使用】](https://qiita.com/vitamin_b12/items/2fc45588640c479e1f4d)
[【ループ構造の使用】while文、do-while文、for文、拡張for文](https://qiita.com/vitamin_b12/items/23d853dda9baf727e4ac)
[【メソッドとカプセル化の操作①】メソッドの概要](https://qiita.com/vitamin_b12/items/215ad731221c2691c441)
[【メソッドとカプセル化の操作②】オーバーロード、コンストラクタ](https://qiita.com/vitamin_b12/items/e4fd3d51a35bb6a5566c)
[【継承の操作①】クラスの継承](https://qiita.com/vitamin_b12/items/19f8ad6f9801ac8f6a8f)
[【例外の処理】](https://qiita.com/vitamin_b12/items/f7ebf2c1106a7dcbdb41)
[【Java APIの主要なクラスの操作】](https://qiita.com/vitamin_b12/items/dcd3edfe2273e5a09231)