【Java】配列とリスト

# はじめに
プログラミング初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。

# Rubyの配列との違い
Javaの配列は、Rubyの配列と性質が異なります。

Javaの配列は、格納する要素の数を最初に決める必要があり、かつ後で要素数を変更することができないようです。

要素を増やす場合は、サイズの大きな配列に新たに作成して元データをコピーするか、ArrayListというリストの一種を使用します。

# Javaの配列
```java
class Main {
  public static void main(String[] args) {
    int[] scores;
    scores = new int[3];

    scores[0] = 1;
    scores[1] = 5;
    scores[2] = 10;

    System.out.println(scores[0]);
    System.out.println(scores[1]);
    System.out.println(scores[2]);
  }
}
```
```console
 sh -c javac -classpath .:target/dependency/* -d . $(find . -type f -name '*.java')
 java -classpath .:target/dependency/* Main
1
5
10
 
```
上記のコードについて解説します。
Javaの配列を使用する手順としては、
①配列の宣言を行う
②配列の要素を作成し、配列に代入する
③配列の要素に値を代入する

### ①配列の宣言を行う
int型の整数を格納する配列の宣言はint[] scores;と記述します。
```java
int[] scores;
```
この「int」は要素として格納したいデータ型を指定するもので、例えばlong型の整数を格納する配列ならlong[] scores;のように宣言します。

この記述によって、配列という入れ物の宣言を行ったことになります。
### ②配列の要素を作成し、配列に代入する
```java
scores = new int[3];
```
このうち、右辺の部分で「new int[3];」とし、
このコードで、int型の要素を３つ作成しています。
そして、配列scoresに代入します。
ここまでのコードによって、配列の宣言と、配列に３つの要素を代入する受け皿を用意することができました。
### ③配列の要素に値を代入する
最後に行うのが値の代入です。
先ほど以下のコードを記述しました。
```java
	
scores[0] = 1;
```
配列scoresの1番目の要素に「1」を代入しています。
この書き方はRubyと似ていて、1番目」を表すインデックスとして「0」を指定することもRubyと同じです。

また、配列の要素を取り出すときは、以下のように行います。
```java
scores[0]
```
この書き方もRubyと同じです。

配列を使う際の記述方法にはいくつかのバリエーションがあるようなので、記述していきます。

# 配列の様々な記述方法について
### ① 配列の宣言と同時に、要素の作成も行う方法
先ほど実行したコードでは、以下のように配列の宣言と要素の作成を別に行っていました。
```java
int[] scores;
scores = new int[3];
```
この２つは、以下のように1行で記述することもできます。
```java
int[] scores = new int[3];
```
### ②配列の宣言時に型推論を使用する方法
型推論を使った配列の宣言は以下のようになります。
```java
var scores = new int[3];
```
int型の要素３つを代入することで、scoresはそれらを格納する配列であることが推論されています。
### ③ 配列の宣言から値の代入まで全て同時に行う方法
配列の宣言時に代入する値が確定している場合は、以下のように記述を省略することができます。
```java
int[] scores = {1, 5, 10};
```
この記述方法が最も簡潔ですが、宣言時に代入する値が確定していない場合は使用できません。

# リストについて
リストは、Rubyの配列と似たデータ管理の仕組みです。
以下の特徴があります。

要素を順序づけて管理する
要素を事後的に追加したり削除できる
また、Javaのリストには、以下の2種類があります。

ArrayList
LinkedList

# ArrayListについて
ArraListは「可変長配列」を使用するための仕組みです。可変長配列とは、文字通り長さ（要素数）を変更できる配列のことです。

Rubyの配列は可変長なので、Javaの配列よりもArrayListの方が性質や使い方が近いものとなっています。
```java
import java.util.ArrayList;

class Main {
  public static void main(String[] args) {
    ArrayList<Integer> scores = new ArrayList<Integer>();

    scores.add(1);
    scores.add(5);
    scores.add(10);
    scores.add(15);

    System.out.println(scores.get(0));
    System.out.println(scores.get(1));
    System.out.println(scores.get(2));
    System.out.println(scores.get(3));
  }
}
```
ArrayListを使用する際は、事前にライブラリのインポートが必要です。
上記のコードを記述する際は、1行目にimport文があることに注意しましょう。
```java
 sh -c javac -classpath .:target/dependency/* -d . $(find . -type f -name '*.java')
 java -classpath .:target/dependency/* Main
1
5
10
15
 
```
上記で記述したコードでは、以下の４つを行なっています。

① ライブラリをインポートする
② ArrayListの宣言を行う
③ ArrayListに値を代入する
④ ArrayListから要素を取り出す

それぞれの使い方について確認します。

### ① ライブラリをインポートする
ArrayListを使用する際は、ライブラリのインポートが必要です。
インポートするには、ファイルの冒頭に以下の記述を行います。
```java
import java.util.ArrayList;
```

### ② ArrayListの宣言を行う
ArrayListの宣言と初期化は以下のように行います。
```java
ArrayList<データ型> scores = new ArrayList<データ型>();
```
先ほどのコードでは、整数を格納するArrayListを作成したので、以下のように記述しました。
```java
ArrayList<Integer> scores = new ArrayList<Integer>();
```
ここで行っているのは、以下の２つの動作です。

① 整数（Integer）を格納するArrayListを「score」という名称で宣言
② ArrayListの要素を作成

そして、①に②を代入しています。

なお、要素のデータ型を右辺でも指定していますが、これは省略することが可能です。
以下のように記述しても問題なく動作します。
```java
ArrayList<Integer> scores = new ArrayList<>();
```
### ③ ArrayListに値を代入する
ArrayListに要素を追加するためにはaddメソッドを使用します。

記述は、add(要素として追加する値)のように行います。

先ほど実行した以下のコードでは、scoresという名称のArrayListに「1」を追加しました。
```java
scores.add(1);
```
addメソッドを使用すると、要素はArrayListの末尾に追加されます。
### ④ ArrayListから要素を取り出す
要素を取り出す際は、getメソッドを使用します。

記述は、get(取得したい要素のインデックス） のように行います。配列から要素を取り出す際と同様に、「1番目」の要素を取り出したい時は、インデックスとして「0」を指定します。

先ほど実行した以下のコードでは、scoresから、1番目の要素を取得しています。
```java
scores.get(0)
```