En Java, un tableau multidimensionnel est-il stocké dans l'ordre des colonnes ou des lignes?
Java n'a pas de tableaux multidimensionnels. Il a des tableaux de tableaux. Ainsi, par exemple,
int[][]
... est un tableau de int[]
(et bien sûr int[]
est un tableau de int
).
Par conséquent, Java n'est ni un ordre de colonne ni de ligne (mais voyez la note ci-dessous sur la façon de lire a[2][3]
), car alors que les entrées d'un tableau donné sont stockées dans un bloc de mémoire contigu, les tableaux subordonnés vers lesquels pointent ces entrées sont des références d'objet à des blocs de mémoire complètement distincts et sans rapport. Cela signifie également que les tableaux de tableaux de Java sont intrinsèquement dentelés: l'entrée à [0]
peut faire référence à une baie à 3 emplacements, celle de [1]
peut faire référence à une baie à 4 emplacements, [2]
peut ne pas faire référence du tout à un tableau (il peut avoir null
), et peut-être [3]
fait référence à une baie à 6 emplacements.
Une image vaut 1k-24 mots et tout ça:
+ −−−−−−−− + + −−−−> | 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 | + −−−−−−−− +
Une fois que vous savez cela, vous savez que (par exemple) a[2][3]
signifie "Obtenir le tableau référencé par l'entrée à l'index 2
de a
, puis obtenez l'entrée référencée par l'index 3
de ce tableau subordonné. "Je pense que c'est assez similaire à l'ordre des lignes principales, mais ce n'est pas tout à fait la même chose.
En Java, vous ne disposez que de tableaux unidimensionnels.
Les tableaux 2D sont essentiellement des tableaux unidimensionnels de tableaux unidimensionnels.
int[ ][ ] table;
table = new int[3][ ];
table[0] = new int[5];
table[1] = new int[5];
table[2] = new int[5];
Ni. Ce que nous pouvons parfois considérer comme un tableau à deux dimensions dans Java est en fait un tableau de références à des tableaux. Il n'est pas stocké linéairement en mémoire.
La spécification de langage Java Language le note dans l'introduction:
Le langage prend en charge les tableaux de tableaux, plutôt que les tableaux multidimensionnels.
Cela a plusieurs implications.
À partir de JLS, section 10.2, "Variables de tableau" :
Une seule variable de type tableau peut contenir des références à des tableaux de longueurs différentes, car la longueur d'un tableau ne fait pas partie de son type.
À partir de JLS, section 10.7, "Array Members" :
Un clone d'un tableau multidimensionnel est peu profond, c'est-à-dire qu'il ne crée qu'un seul nouveau tableau. Les sous-réseaux sont partagés.