oracleJavaSilverの勉強日記(配列の作成と使用)

配列

配列は、複数の値の集合を1つにまとめて扱うためのインスタンス

配列には、2つの特徴がある。

・同じ型、もしくは互換性がある型の値しか扱えない

・扱える要素数インスタンス生成時に決める。あとで要素数を変えることはできない

配列を使うには、他のオブジェクトと同様にnewキーワードを使って、配列のインスタンスを生成しなければいけない。

配列インスタンスの生成

new int[3];

他のオブジェクトと同様に、変数に格納した参照を経由して扱う。

配列型変数の宣言

int array;

配列型変数には、配列インスタンスの参照を代入する。変数に値が直接入るわけではない

※「int array;」の大かっこは、変数名の後ろに記述することもできる。

配列型変数に宣言時に、要素数の指定はできない。

多次元配列

・配列は複数の参照をひとまとめにして扱うことができる。

・配列そのものもインスタンスであり、参照を投資て扱える。

このように、さらに他の配列への参照を持っている配列のことを多次元配列と呼ぶ。

2次元配列(例)

int array;

int array;

3次元配列(例)

int array;

int array;

配列インスタンスの生成

配列インスタンスの生成には、素数の指定をしなければいけない。

素数の指定は、整数値で記述しなければいけない。また、要素数の指定にはint型を使う。同じ整数値でもlong型は使えない。

多次元配列の場合は、1次元目の要素だけは省略することができない。

多次元配列の場合は、変数とインスタンスの間で次元数を一致にしなければいけない。

配列インスタンスと要素の値

要素のデフォルト値は、配列インスタンスを生成した直後は、これらの値で要素は初期化されている。

整数型:0

浮動小数点数型:

真偽値:false

文字型:¥u0000

オブジェクト型:null

 

配列インスタンス生成と同時に要素の値を初期化したい場合は初期化演算子{}」を使う。

初期化演算子を使用して要素の値を初期化

int array = {10,20,30};

int array=new int{2,3};

どちらのコードも同じ意味を持つが、校舎の方法には注意点がある。

newと初期化演算子の両方を使った場合は、大かっこ「」の中に要素数を指定してはいけない

初期化演算子には「変数宣言と同時にしか使えない」というルールがある。

そのため、変数宣言と配列のインスタンス生成を分けて記述することはできない。

int d;

d = {2,3};

ただし、配列インスタンスを作る時に大かっこを使って、明示的に次元数を記述すれば、コンパイルエラーにならない。

int d;

d=new int{2,3};

 

null

nullで初期化されている要素を、lengthを使って要素数を数えようとしたときは、NullpointerExceptionという例外がスローされる。

 

継承と実現関係

あるクラスが継承関係にあるとき、スーパークラス型の配列型変数で、サブクラスのインスタンスの集合を扱える。

Object[] obj = {"A", "B", "C"};

Object型しか扱わない配列型変数とStringしか扱わない配列インスタンスは、扱う型が異なるが、StringクラスはObjectクラスを継承するため、コンパイル・実行できる。

配列型変数は、Object型に暗黙的に型変換できる。

cloneメソッド

同じ値を持った配列インスタンスが複製される。

f:id:enma_IT:20220224112604p:plain

2行目で、arrarAと同じ値を持った配列インスタンスを生成

3行目は、値は同じだがインスタンスの参照は異なるため「false」

5行目で、arrayAと同じ値を持っているので、出力される。

arraycopyメソッド

配列の任意を範囲だけコピーしたい時に使う。

第1引数:コピー元となる配列

第2引数:コピー元のどの位置からコピーを開始するか(0始まり)

第3引数:コピー先の配列

第4引数:コピー先配列のどの位置からコピーを開始するか(0始まり)

第5引数:第2引数の位置からいくつの要素をコピーするか

System.arraycopy(arrayA, 1, arrayB, 0, 4);

「arrayAの1番目から4つの要素をarrayBの0番目からコピーする。」という意味になる