LoginSignup
15

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-24

はじめに

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はごちゃごちゃで今一分かり辛くなるっていう印象です
まだまだこの二つの使い分けとかが分かってないので、しっかりと勉強していきたいと思います

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15