Javaの配列とArrayListの違いについて、似た機能のメソッドを比較・対応してみた

# はじめに

Javaの問題を解くとき、プログラムの作成条件として、"配列を使うように"とのお達しがあったのですが、
「はて、ArrayListではアカンのか？」
「そもそも配列ってなんだったっけ、めちゃくちゃ曖昧にしか認識してない」
と感じたので色々と調べてみました。
複数の言語を触った経験が悪影響を及ぼし、『リスト』『タプル』『配列』『ArrayList』など、あらゆるキーワードがごちゃまぜになっている状態です。
Javaに限ってもLinkedListなんてものもまだありますし、整理がなかなか大変です。


網羅的に、そして深くまで把握するのは今の自分には厳しかったのと、更にそれを記事にまとめるのも厳しいと感じたので、
ふわっとした感じ、「とりあえず間違ってはいない」という内容になるように努めました。
ジェネリクスだとか実装だとか、そういったものはまだ理解＆説明しきれる気がしません・・

# 実行環境
[Paiza.io] (https://paiza.io/ja/projects/new) : openjdk version "15" 2020-09-15)

# この記事でわかること

- 配列とArrayListは大体こんな感じで異なる
- 「配列でこう書く」 vs 「ArrayListでこう書く」
  - 宣言
  - 要素の代入
  - 要素の追加
  - 要素の取得
  - 要素数（大きさ）の取得 


# 配列とArrayListの違い

## 配列とArrayListの特徴からみた違い

色々と調べたのですが、とにかく掘れば掘るほど情報がでてくる上、
内容も濃いものまで含まれるため、簡単にとどめます。


配列は固定長です。
宣言したときに要素数が固定され、変更することができません。
例えば「こいつは要素を5個入れるように設定しよう！」としたとき、6個目の要素を入れることはできません。

これに対して、ArrayListは可変長です。
一応、初期要素数の設定はするのですが（あるいは指定せずともデフォルトで設定される）
その要素数を超過しても、要素を次々に放り込むことが可能です。

補足

> 大きさは変更可能なのですけど、一応初期サイズとして10個の要素が格納できるArrayListを作成してくれます。このサイズは足りなくなれば自動的に拡張されるのであまり気にする必要はありません。
[Let's プログラミング 初心者の方でもわかりやすいサイト](https://www.javadrive.jp/start/arraylist/index1.html)


## 宣言について

### 配列の宣言

hogeというint型の配列を作り、そこに1から5までの整数を入れてみます。
ひとまず調べてみたところ、3種類ヒットしたのでそれらを記します。

```Java
        int[] hoge;
        hoge = new int[5];
        hoge[0] = 1;
        hoge[1] = 2;
        hoge[2] = 3;
        hoge[3] = 4;
        hoge[4] = 5;

```

```Java
int[] hoge = new int {1, 2, 3, 4, 5}
```

```Java
int [] hoge = {1, 2, 3, 4, 5}
```

### ArrayListの宣言

hogeというInteger型のArrayListを作り、1から5までの整数を入れてみます。
ひとまず調べてみたところ、3種類ヒットしたのでそれらを記します。
`Integer`？ `int`じゃないの？と思った方は、
「Java プリミティブ型 ラッパークラス」あたりで検索かけると幸せになれるかもしれません。

```Java
ArrayList<Integer> hoge = new ArrayList<Integer>();
hoge.add(1);
hoge.add(2);
hoge.add(3);
hoge.add(4);
hoge.add(5);

// 他の書き方として、
// List<Integer> hoge = new ArrayList<Integer>();
// あるいはJava 10以降なら
// var hoge = new ArrayList<Integer>();
// という書き方でもいいよ

```

```Java
List<Integer> list = new ArrayList<Integer>(){
{
    add(1);
    add(2);
    add(3);
    add(4);
    add(5);
             };
```

```Java
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
// こういう書き方もできるけど、可変長ではなくなるので注意
```

## 要素の代入について

例として、hogeという配列（ArrayList）の0番目に5を代入します。

### 要素の代入（配列のとき）


```Java
hoge[0] = 5;
```

### 要素の代入（ArrayListのとき）

```Java
hoge.set(0, 5)
```

## 要素の追加
例としてint型の値 10 を追加します

### 要素の追加（配列のとき）

固定長なので、そもそもできない。

### 要素の追加（ArrayListのとき）

```Java
hoge.add(10);
```

## 要素を取得する

例として配列（ArrayList）の0番目の要素を取り出します。
**配列とArrayListでカッコの種類が違うので注意！**

### 要素を取得する（配列のとき）

```Java
int foo = hoge[0];
```

### 要素を取得する（ArrayListのとき）

```Java
int foo hoge.get(0);
```

## 要素数（大きさ）を取得する

### 要素数を取得する（配列のとき）
```Java
int foo = hoge.length
```


### 要素数を取得する（ArrayListのとき）
```Java
int foo = hoge.size();
```

# おわりに
今後ひんぱんに使うだろうなぁと思った操作を挙げて対応してみました。
加筆するかもしれません。


# 参考
- スッキリわかるJava入門 第3版
- [Arrays (Java Platform SE 7 )](https://docs.oracle.com/javase/jp/7/api/java/util/Arrays.html#toString(double[]))
- [JavaでListの要素を初期化・追加する方法](https://qiita.com/yuki2006/items/be1433c50002cc24603b)
- [「ArrayList で変数を宣言してはいけません！」からはじまる疎結合の解説](https://qiita.com/Mura-Mi/items/e52c28ab7cb5db140d53)
- [【Java】ListとかMapを初期化するとき、型って省略していいの？](https://t-hsn.com/tech/201901/post-125/)
- [Let'sプログラミング 初心者の方でも分かりやすいサイト- ArrayListクラス](https://www.javadrive.jp/start/arraylist/index1.html)
- [Let'sプログラミング 初心者の方でも分かりやすいサイト - 要素の置き換え](https://www.javadrive.jp/start/arraylist/index3.html)