⚒️

[Java]配列

2023/09/30に公開

配列とは?

配列は、同じ型の複数の値をまとめて一つの変数として扱うことができるものです。配列の値は順番に並べられていて、特定の値を取り出したりすることもできます。
配列の各要素には同一種類のデータしか格納できません。
また各要素には番号が付くのですが、それは1から始まるのではなく0番目から始まるので注意が必要です。
ちなみにこの順番を間違えるとjava.lang.ArrayIndexOutOfBoundsExceptionというエラーメッセージが表示されます。

配列の書き方

配列は

  1. 配列変数の宣言
  2. 要素の作成と代入
    の順番で作成します。
書き方
型名 配列変数名[] = new 型名[要素数];

また配列の要素の数を取得することもできます。

配列変数名.langth

文字列の場合はこのように記述します。

文字列変数名.length();

文字列の「length」は()をつけて配列はつけないと覚えておきます。

上記の2つを使用して配列の要素に値を代入すると下記のようになります。
ここでscoresの初期値を記述していないのは、配列の要素を自動的に初期化されるからです。

public class Lesson2 {
  public static void main(String[] args) {
    int[] scores = new int[5];
    scores[1] = 30;
    System.out.println(scores[1]);
  }
}

配列とfor文

配列にfor文を組み合わせることで様々な活用ができるようになります。

  1. ループによる全要素の利用
  2. ループによる集計
  3. 添え時に対応した情報の利用

ループによる全要素の利用

配列の最初から最後までの全要素を順番にアクセスするという物です。
このパターンが一番使用されます。

for (int i = 0; i < 配列変数名.length; i++)
public class Lesson4 {
  public static void main(String[] args) {
    int[] scores = {20, 30, 40, 50, 60};
    for (int i = 0; i < scores.length; i++) {
      System.out.println(scores[i]);
    }
  }
}

Javaにはループによる全要素の利用を簡単に書くための拡張for文が準備されています。
上記の記述を書き直すとこのようになります。

public class Lesson4 {
  public static void main(String[] args) {
    int[] scores = {20, 30, 40, 50, 60};
    for (int value : scores) {
      System.out.println(value);
    }
  }
}

このように省略して簡単に記述することができます。

for (要素の型 任意の変数名 : 配列の変数名) {
:
}

ループによる集計

for文を用いて要素を1つずつ足していき、ループが終了した時点で全要素の値が足されているというものです。
たとえば、50点以上の科目数を調べる場合は下記のようになります。

public class Lesson5 {
  public static void main(String[] args) {
    int[] scores = {20, 30, 40, 50, 90};
    int sum = 0;
    for (int i = 0; i < scores.length; i++) {
      sum += scores[i];
    }
    int avg = sum / scores.length;
    System.out.println("合計点" + sum);
    System.out.println("平均点" + avg);
  }
}
実行結果
合計点230
平均点46

添え時に対応した情報の利用

0~3の整数がランダムに格納された10個の要素を持つ配列seqがあり、各要素の整数は4種類のDNAの種類名を持っています。
表示する際には整数に対応させた各記号を表示させます。

public class Lesson7 {
  public static void main(String[] args) {
    int[] seq = new int[10];
    
    //ランダムに整数を生成
    for (int i = 0; i < seq.length; i++) {
      seq[i] = new java.util.Random().nextInt(4);
    }
    
    //生成した整数に種類名を表示
    for (int i = 0; i < seq.length; i++) {
      char[] base = {'A', 'B', 'C', 'D'};
      System.out.println(base[seq[i]]);
    }
  }
}

今回初めて出てきた表現で

char[] base = {'A', 'B', 'C', 'D'};
      System.out.println(base[seq[i]]);

ですが、分解すると下記のようになりbaseの配列に要素を代入し、seqに入っている生成した整数と対応している種類名を取得しています。

int baseType = seq[i];
char baseChar = base[baseType];
System.out.println(baseChar + " ");

配列の舞台裏

メモリと変数

これまで配列は「~[]型の配列変数に~型の要素を入れて作成する」というイメージで記述してきましたが、これはあくまでも人間用に見やすくなっているだけで実際にPCで処理されている構造ではないです。
コンピューターはデータをメモリに記憶しており、メモリの中は基盤の目のように区画整理されており、各区画にはアドレス(住所)が降られています。
変数を宣言すると空いている区画を変数のために確保します。

メモリと配列

int型の5つの要素を格納する配列を作成したとき、メモリの中がどうなっているかというと、
配列変数の宣言によりint[]変数が、new演算子により配列の実態(要素の集まり)がメモリ上の区画に作成されます。
そして配列変数には5つの要素まるごと代入されるのではなく、最初の要素のアドレスだけが代入されます。

たとえば int[] scores = new int[5];を実行した後に scores[n]と指定した
ときのメモリ上の様子はこのようになります。

  1. int型の要素を5つ持つ配列がメモリ上に作成される。
  2. int[]型の配列変数scoresがメモリ上に作成される。
  3. 配列変数scoresに配列の先頭要素のアドレスが代入される。
  4. scoresから保存されている番地を取り出し、配列(先頭要素)を見つける。
  5. 見つけた配列の先頭要素からn番目の要素の区画を読み書きする。

まとめ

for文を使って配列を活用するのは頻繁に使う手法なので、たくさんコード書いて慣れなければ、、、。
来月から就活本格化するので、少しずつでも継続学習頑張ります。

Discussion