Java初心者がArrayとかArrayListの挙動とかを簡単にまとめてみた

#はじめに
JavaのArrayとかArrayListの動きがよく分かってなかったので、よく使いそうな部分をまとめてみました

#サンプルコード
Main1ではArray、Main2ではArrayListの基本的な作成方法とか値の取得方法を記述してます
Main3、Main4ではそれぞれの多次元配列について記述してます

###Main1

```Main1.java
import java.util.Arrays;

/**
 * Created 2017/05/24.
 * Main1では通常のArrayの挙動一覧
 */
public class Main1 {
  public static void main(String[] args) {
    
    //配列の作成の仕方
    //宣言方法その1
    
    //配列の型と名前を宣言
    //int[] num;  
    
    //使う領域を確保する
    //num = new int[3];             

    //宣言方法その2
    //上のやり方を同時に行う方法 
    int[] num = new int[3];               

    //配列への格納
    num[0] = 1;
    num[1] = 2;
    num[2] = 3;

    //作成から格納までまとめてやる場合
    // int[] num = {1, 2, 3};

    //配列の取り出し
    System.out.println(num[0]);
    //実行結果：1

    //まとめて全部取り出す方法

    // 通常のfor文でループさせる場合
    for (int i = 0; i < num.length; i++) {
      System.out.print(num[i] + " ");
      //実行結果：1 2 3
    }

    System.out.println(" ");                //実行後の見栄えのために入れてます

    //拡張for文を使う場合
    for (int value : num) {               
      //valueは任意の変数名,普通のforとは異なり、変数名をそのまま使う
      System.out.print(value + " ");      
      //実行結果：1 2 3
    }
    System.out.println(" ");                //同上

    //配列の中身を一括で表示する方法（Rubyで言うpメソッド的なやつ）
    // Arrays.toStringを使うと良い感じに出る
    //使用時の注意として、使う際はimport java.util.Arrays;の宣言が必要な事
    //もう一つは対象の配列が多次元配列の場合、Arrays.deepToStringと書かないといけない
    
    System.out.println(Arrays.toString(num));
    //実行結果：[1, 2, 3]

    //こうやって書くと謎の文字列になる
    System.out.println(num);
    //実行結果:[I@1540e19d


    //補則とか色々
    //Arrayでは最初に宣言した要素数を超えて格納することは出来ない
    //num[3] = 4;  //配列の4番目に4を格納するように書いても意味が無く、実際には入らない
    //System.out.println(num[3]);
    //挙動としてはコンパイルエラーは出ないが実行にエラーが出る
    //Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3という風に怒られる
    //また配列への格納宣言をしてない所、例えばnum[5]やnum[6]の値を表示させようとした場合にも同じエラーが出る
  }
}
```

実行結果

```Main1.Java
1
1 2 3  
1 2 3  
[1, 2, 3]
[I@1540e19d
```

###Main2

```Main2.java
import java.util.ArrayList;

/**
 * Created 2017/05/24.
 * Main2ではArraysListの通常挙動について記載
 */
public class Main2 {
  public static void main(String[] args) {
    //ArrayListの作成方法
    //基本的な宣言
    //ArrayList<Integer> num = new ArrayList<Integer>();

    //JavaSE7以降の定義例
    ArrayList<Integer> num = new ArrayList<>();

    //補足
    //new ArrayList<>();の()は、数値を入れることで、配列の初期サイズを決めることが出来る
    
    //格納方法
    //addメソッドを使う
    //書き方としてはadd(格納したいデータ）、またはadd(インデックス（格納する位置),格納したいデータ)で記述する
    //基本的に順番に格納されていく
    //インデックス指定した際に、既に値が存在している場合,値を上書きするのではなく、一つ横にずれるように格納されるので注意
    num.add(1);
    num.add(1, 2);
    num.add(3);
    //num.add(2,4);
    //このように追記した場合、[1,2,4]でなく、[1,2,4,3]という配列になるので注意すること
    //もし値を更新する場合はnum.set(2,4);のように、.set()を使うと[1.2,4]が得られる

    //値の取り出し
    
    //get()メソッドを使う
    System.out.println(num.get(0));
    //実行結果：1
    

    //まとめ手取り出す
    //for文
    //ArrayListの場合は、要素数を得るには.size()を使う
    for (int i = 0; i < num.size(); i++) { 
      System.out.print(num.get(i) + " ");
      //実行結果:1 2 3
    }
    
    System.out.println(" ");

    //拡張for文
    for (int value : num) {
      System.out.print(value + " ");
      //実行結果:1 2 3
    }
    
    System.out.println(" ");

    //pメソッドのように一括表示する際は、そのままprintlnに突っ込めば良い
    System.out.println(num);
    //実行結果:[1, 2, 3]
  }
}
```

実行結果

```Main2.java
1
1 2 3  
1 2 3  
[1, 2, 3]
```

###Main3

```Main3.java
import java.util.Arrays;

/**
 * Created 2017/05/24.
 * Main3では通常のArrayにおける、多次元配列を作成した時の挙動一覧
 */
public class Main3 {
  public static void main(String[] args){
    //宣言と作成
    int [][] num = new int[2][3];
    
    //値の格納
    num[0][0] = 1;
    num[0][1] = 2;
    num[0][2] = 3;
    num[1][0] = 10;
    num[1][1] = 11;
    num[1][2] = 12;
    
    //値の取り出し方
    System.out.println(num[0][0]);
    //実行結果:1
    System.out.println(num[1][2]);
    //実行結果:12
    
    //まとめて全部取り出す場合
    //forを使って2重ループさせる
    //iはnum全体の要素数、num.lengthでループ
    for(int i = 0; i < num.length; i++){
      //jは各配列の要素数、num[i].lengthまでループ
      for(int j = 0; j < num[i].length;j++){
        System.out.print(num[i][j] + " ");
        //実行結果：1 2 3 10 11 12 
      }
    }

    System.out.println(" ");
    
    //拡張forの場合
    //こちらも2重ループで書く
    //取り出すデータとして配列を指定する
    for(int[] index : num) {
      //次にその配列から中身を取り出す形にする
      for (int element : index) {
        System.out.print(element + " ");
        //実行結果：1 2 3 10 11 12 
      }
    }

    System.out.println(" ");
    
    //一括表示
    //多次元配列の場合はArrays.deepToString();を使う
    System.out.println(Arrays.deepToString(num));
    //実行結果:[[1, 2, 3], [10, 11, 12]]
  }
}
```

実行結果

```Main3.java
1
12
1 2 3 10 11 12  
1 2 3 10 11 12  
[[1, 2, 3], [10, 11, 12]]
```

###Main4

```Main4.java
import java.util.ArrayList;

/**
 * Created 2017/05/24.
 *  * Main4ではArraysListの多次元での挙動について記載
 *  理解は出来るけど、扱い辛い
 */
public class Main4 {
  public static void main(String[] args){
    //二次元のArrayListの作り方
    //まずは普通のArrayListを2つ作成）
    ArrayList<Integer> num1 = new ArrayList(); 
    num1.add(1);
    num1.add(2);
    num1.add(3);
    
    System.out.println(num1);
    //実行結果:[1, 2, 3]
    
    ArrayList<Integer> num2 = new ArrayList<Integer>();
    num2.add(10);
    num2.add(11);
    num2.add(12);

    System.out.println(num2);
    //実行結果:[10, 11, 12]
    
    //次に格納するArrayListを作成します、宣言するデータ型に注目
    //データ型の宣言時に、格納するデータは「ArrayList<Integer>を格納します！」と宣言すれば入れられる
    ArrayList<ArrayList<Integer>> num_list =new ArrayList<>();
    num_list.add(num1);
    num_list.add(num2);
    
    //取り出し方
    //.get().get()で取り出し
    System.out.println(num_list.get(0).get(0));
    //実行結果:1
    System.out.println(num_list.get(0).get(2));
    //実行結果:3
    System.out.println(num_list.get(1).get(0));
    //実行結果:10
    
    //全部取り出す
    //for
    //iはnum全体の要素数、num.size()でループ
    for(int i = 0; i < num_list.size(); i++){
      //jは各配列の要素数、num[i].size(()までループ
      for(int j = 0; j < num_list.get(i).size();j++){ 
        System.out.print(num_list.get(i).get(j) + " ");
        //実行結果:1 2 3 10 11 12
      }
    }
    System.out.println(" ");
    
    //拡張for
    //変数宣言でArrayList<Integer> ＋変数名で宣言すれば、値を引っ張ることが出来る！
    for(ArrayList<Integer> index : num_list) {
      //後は普通の拡張for文で記載
      for (int element : index) {
        System.out.print(element + " ");
        //実行結果:1 2 3 10 11 12
      }
    }

    System.out.println(" ");
    
    //一括表示
    System.out.println(num_list);
    //実行結果:[[1, 2, 3], [10, 11, 12]]
    
    //値の追加方法
    //.add()を使用すればで良いが、各配列ごとに追加、あるいは新規に配列を作成して追加するしかない？
    //num_list.add()の形で直接追加してみたいけど、結局分からず
    
    num1.add(4);
    num2.add(13);
    
    //新規の配列追加
    ArrayList<Integer> num3 = new ArrayList<Integer>();
    num3.add(20);
    num3.add(21);
    num3.add(22);
    
    num_list.add(num3);
    
    System.out.println(num_list);
    //実行結果[[1, 2, 3, 4], [10, 11, 12, 13], [20, 21, 22]]
  }
}
```

実行結果

```Main4.java
[1, 2, 3]
[10, 11, 12]
1
3
10
1 2 3 10 11 12  
1 2 3 10 11 12  
[[1, 2, 3], [10, 11, 12]]
[[1, 2, 3, 4], [10, 11, 12, 13], [20, 21, 22]]
```

#所感
元々Rubyをやっていたので、ArrayListのような可変長配列の方が直感的に使いやすかったのですが
多次元配列になるとArrayListはごちゃごちゃで今一分かり辛くなるっていう印象です
まだまだこの二つの使い分けとかが分かってないので、しっかりと勉強していきたいと思います