Javaでは、多次元配列は列優先または行優先の順序で格納されますか?
Javaには多次元配列はありません。配列の配列があります。たとえば、
int[][]
...はint[]
の配列です(そしてもちろんint[]
はint
の配列です)。
その結果、Javaは列優先でも行優先でもありません(ただし、a[2][3]
の読み取り方法については、以下の注を参照してください)。これは、特定の配列のエントリがメモリの連続したブロックに格納されている間、これらのエントリが指す従属配列は、メモリの完全に分離された、関連のないブロックへのオブジェクト参照です。これは、Javaの配列の配列が本質的にjaggedであることも意味します:[0]
のエントリは3スロット配列を参照する場合があります[1]
にあるものは4スロット配列を参照する場合があり、[2]
は配列をまったく参照しない場合があります(null
が含まれる場合があります)。おそらく[3]
は6スロット配列を参照します。
写真は1k〜24語程度の価値があります。
+ −−−−−−−− + + −−−−> | int [] | + −−−−−−−−−−− + | + −−−−−−−− + | int [] [] | | | 0:int | + −−−−−−−−−−− + | | 1:int | | 0:int [] | −−−−−− + | 2:int | | 1:int [] | −−−−−− + + −−−−−−−− + | 2:null | | | 3:int [] |-+ | + −−−−−−−− + + −−−−−−−−−−− + | + −−−−> | int [] | | + −−−−−−−− + | | 0:int | | | 1:int | | | 2:int | | | 3:int | | + −−−−−−−− + | | + −−−−−−−− + + −−−−−−−−− | int [] | + −−−−−−−− + | 0:int | | 1:int | | 2:int | | 3:int | | 4:int | | 5:int | + −−−−−−−− +
これがわかったら、(たとえば)a[2][3]
が「a
のインデックス2
のエントリによって参照される配列を取得してから、その下位配列のインデックス3
によって参照されるエントリを取得する」ことを意味します。行優先順とかなり似ていると思いますが、まったく同じではありません。
Javaでは、1次元配列しかありません。
2D配列は、基本的には1次元配列の1次元配列です。
int[ ][ ] table;
table = new int[3][ ];
table[0] = new int[5];
table[1] = new int[5];
table[2] = new int[5];
どちらでもない。 Javaの2次元配列と考える場合もありますが、実際には配列への参照の配列です。これはメモリに線形に格納されません。
Java言語仕様は、これを序論で注記しています:
この言語は、多次元配列ではなく、配列の配列をサポートしています。
これにはいくつかの意味があります。
配列の長さはその型の一部ではないため、配列型の単一の変数には、異なる長さの配列への参照が含まれる場合があります。
多次元配列のクローンは浅いです。つまり、新しい配列を1つだけ作成します。サブアレイは共有されます。