MikiTech

文系新卒エンジニアの学習記録

【Java Silver】配列について

はじめに

Java Silver SE11の勉強メモ

Javaの配列の特徴

配列は、値の集合を扱うための配列クラスから作られる「インスタンス」である。
そのため、必ずどこかでnewを行うはず(?)

配列が扱う値のことを要素と呼ぶ。

なお要素については、

①同じ型、互換性のある型の値しか扱えない
②扱う要素数は、インスタンス生成時(newした時)に決める。  
 あとで要素数は変えられない。  

配列の宣言

配列のインスタンス生成の流れは以下。

int a[]; //配列型変数の宣言
a = new int[3]; //配列インスタンスの代入

短く書くと。。。

int a[] = new int[3]

となる。

ちなみに。

int [] a;

と、[]と変数名を逆に宣言することも可能。

int[0]を宣言するとどうなるのか?

int a[] = new int[0]

要素を一つも入れられないと言うだけの話。
コンパイルエラーにはならない。

配列型変数をprintlnすると

配列はインスタンスである。
ので、配列型の変数をそのままprintlnすると、ハッシュコードが出力される。

todomasa.hatenadiary.org

多次元配列

自分が苦手な部分… 配列の基本的な考えはここがわかりやすいとおもう。
eng-entrance.com

上記サイトの例のように、よく見るのは先程と同じような宣言方法の

int a[][] = new int[4][4] //2次元配列
int b[][][] = new int[3][2][3] //3次元配列

ただ[]をまとめる必要はなく、  以下のような記述ももちろんOK。

int[] a[][];
int[][] b[];

int[要素数]変数名はOUT

あくまで左辺は変数宣言なので、そこに要素数を入れる事はできない
コンパイルエラーが発生する。

素数の指定の仕方

①配列インスタンスの生成には、必ず要素数の指定が欠かせない。  
②要素数は、int型であり浮動小数点数等は利用できない。  

多次元配列の生成のされ方

ここは初見だった。
例えば以下のような2次元配列。

int[][] array = new int[3][3];

実は、配列されるうえで順序が存在する。
まず最初に1次元目の配列が生成された後、2次元目が生成される。

1次元目は必ず生成されなければならない
例えば以下のようなコードはアウト。

int[][] a = new int[][3];

こちらは1次元目から宣言しているためOK。

int[][] array = new int[3][];
array[0] = new int[2];

上記のコードは、
1次元目が3つの要素を持つarrayという配列インスタンスを生成し、
1つめの要素に2つの要素を持つ2次元目を生成している様子。

1次元目は欠かせないが、2次元目からは別で入れることが出来たりする。

初期化子を使った宣言

配列はインスタンスなためnewしなければならなかったりするが、
生成、初期化から変数宣言・参照まで配列を扱うに当たる4つのステップを一つにまとめることも可能。
{}初期化子を利用することである。

int[] array = {4,3}//書き方①
int[] array = new int[]{4,3}//書き方②

これは以下と同じ。

int[] array = new int[2];
int[0] = 4;
int[1] = 3;

ただ、書き方②のnewを使う場合は、[]内に要素数を指定してはいけない。
通常は指定するが、{}初期化子を利用する場合は自動的に要素数を判断してくれる。
以下のコードはコンパイルエラー。

int[] array = new int[2]{4,3}

以上。