web-dev-qa-db-ja.com

Java:2次元配列は列優先または行優先の順序で格納されますか?

Javaでは、多次元配列は列優先または行優先の順序で格納されますか?

41
Zouzias

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によって参照されるエントリを取得する」ことを意味します。行優先順とかなり似ていると思いますが、まったく同じではありません。

78
T.J. Crowder

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];
5
Kal

どちらでもない。 Javaの2次元配列と考える場合もありますが、実際には配列への参照の配列です。これはメモリに線形に格納されません。

Java言語仕様は、これを序論で注記しています:

この言語は、多次元配列ではなく、配列の配列をサポートしています。

これにはいくつかの意味があります。

  • 配列の配列は jagged にすることができます-メンバー配列は異なる長さを持つことができます。
  • 外部配列のメンバーは参照であり、nullにすることができます。
  • 外側の配列の複製は浅い-メンバー配列は元の配列と複製の間で共有されます。

JLS、セクション10.2、「配列変数」 から:

配列の長さはその型の一部ではないため、配列型の単一の変数には、異なる長さの配列への参照が含まれる場合があります。

JLS、セクション10.7、「配列メンバー」 から:

多次元配列のクローンは浅いです。つまり、新しい配列を1つだけ作成します。サブアレイは共有されます。

4
Andy Thomas