Deep Side of Java〜Java 言語再入門 第2回 〜 Java 文法を中心に

配列オブジェクト






配列オブジェクト

C言語とは違い、Java では配列は特殊なオブジェクトである。また、Cでは多次元配列(char array[5][6])が定義可能だが、Java では「配列の配列」しか定義できない(要するに、配列オブジェクトを格納する配列であり、char *array[5] のこと)。また、配列サイズを越える、あるいは負の添字の添字アクセスは、実行時例外(IndexOutOfBoundsException)を投げる。また、動的に代入型チェックがなされ、代入不可の場合にも実行時例外(ArrayStoreException)が投げられる。

配列宣言はCとは大きく違う。

int [] array = new int [5];
for( int i = 0; i < array.length; i++ ) {
        array[i] = i;
}

オブジェクトであるので、やはり new 演算子を使って確保する。length インスタンス変数は、配列の確保サイズを示す。配列はCと同じく0ベースである。

次のように初期化文を書ける。

int [] array = { 1, 2, 3 };
Integer [] intArray = { new Integer(1), new Integer(2), new Integer(3) };

配列は初期化子によって、初期化される(C++のように初期化できないことはない)。オブジェクトの配列の場合には、配列を確保しただけで配列に格納される実体が確保されないことに注意されたい。

Object [] array = new Object [4];
for( int i = 0; i < array.length; i++ ) {
        array[i] = new Object();
}

とする必要がある。ただし、String 型はプリミティブ型と同様にリテラルによる初期化が可能である。

String [] array = { "banana", "apple", "orange" };

多次元配列は次のように確保する。この実体は「配列の配列」であることに注意。

int [][] array = new int [3][4];
for( int i = 0; i < array.length; i++ ) {  /* array.length == 3 */
    int [] tmp = array[i];
    for( int j = 0; j < tmp.length; j++ ) { /* tmp.length == 4 */
        int n = tmp[j];                    /* n = array[i][j] */
    }
}

また、配列は Object クラスのメソッドは、clone()以外は継承し、clone() は実装されている(つまり、コピーができる)。次のようである。

int [] array1 = { 1, 3, .... };
int [] array2 = array1.clone();

ただし、任意のオブジェクト配列が clone() 出来るかどうかは、そのオブジェクトが Clonable インターフェイスを実装し、clone メソッドを実装しているかどうかによって決まるのでそれ相応の準備が必要である。



copyright by K.Sugiura, 1996-2006