プリミティブ配列

配列は同じ型の変数をまとめて扱うデータ構造ですが、オブジェクト(参照)型だけではなくプリミティブ型の配列も扱う事ができます。
プリミティブ型配列も配列である以上はクラスに近い型であり、インスタンスを生成して使う必要があります。
これはプリミティブ型変数と混同して誤解しやすい点であり、十分に理解して使う必要があります。

プリミティブ配列の初期化

プリミティブ型配列の宣言と初期化はオブジェクト(参照)型配列の場合とほとんど変わりません。
クラス(型)であった箇所がプリミティブ型の名前に変わるだけです。

    int[] nums = new int[10];
    boolean[] bools = new boolean[2];

このようにプリミティブ型配列の宣言を行いますが、これはプリミティブ型変数ではなく参照型変数である事に注意してください。
したがって、newで生成された配列のインスタンスが参照先として代入されているのです。
インスタンスの生成方法に関しては、オブジェクト型配列と同じ書式です。

int nums[]

Javaでは次のように配列を宣言することも可能です。

    int nums[] = new int[10];
    boolean bools[] = new boolean[2];

この書式が認められるのは、C言語の書式をJavaでも取り入れたいという経緯があったからです。
しかし、Javaではnumsはあくまでint型の配列である為、配列の型としてはint[]であると考える方が自然でしょう。

プリミティブ配列の初期値

プリミティブ配列を初期化(インスタンスの生成)を行った場合、オブジェクト配列の初期化とは異なり、各要素にはプリミティブ型変数の初期値が格納されています。


配列はクラスの一種と考えることができました。
あるクラスにインスタンス変数として参照型変数を定義しても明示的にnewでインスタンスを生成するまではnullを参照していましたが、プリミティブ型のインスタンス変数の場合は型毎の初期値が格納されます。
プリミティブ型配列は、その型のプリミティブ型インスタンス変数がサイズの数だけ格納されていると考えることができます。
すなわち、配列を初期化した場合、プリミティブ型配列の場合は、それぞれの要素は初期値が格納されるのです。


この違いは配列を特殊な配列クラスのインスタンスと考えれば自然な事です。
しかし、配列を変数やインスタンスの入れ物として理解すると不自然に感じるのです。

配列のループ

配列はfor文を使うことで簡単に繰り返し処理に応用することができます。

    // 20個の配列にそれぞれ[index * 2 + 1]の値を代入
    int[] array = new int[20];
    for(int i = 0; i < array.length; i++) {
        array[i] = i * 2 + 1;
    }

このプログラムに関しては、特に説明することもないでしょう。

配列のインデックス

配列はC言語などでも扱えるように非常に原始的なデータ構造です。
配列を理解する為に非オブジェクト思考言語における一般的な配列の構造について理解をしておきましょう。


配列は連続したデータを格納する為の構造です。
これをメモリ上で効率良く実現しようとしたならば、隙間無く連続して配置することになります。
各データの間に隙間がなければメモリ量も節約できます。
また、各データは必ず同じバイト数であるとすれば、特定の要素に対してアクセスしたい場合に配列の先頭アドレスから要素数×バイト数でそのデータがあるアドレスを計算することができます。
何故ならば、各データはまるで碁盤の目のように整列されているからです。


すると、配列は一般的に0からインデックスが振られている事にも納得できるでしょう。
最初のデータは0番目とするならば、先頭アドレス+データバイト数×インデックスが配列のデータが格納されているアドレスとなります。
もし、1からインデックスが振られていたとすると、先頭アドレス+データバイト数×(インデックス−1)となり少しだけ計算量が増えてしまいます。
配列が発明された頃のコンピュータでは、その少しの計算量を馬鹿できません。
尚、厳密に言えばC言語ではポインタの概念と配列の概念が絡んでくるのですが、Javaの講座なので深く突っ込むことは避けておきます。