web-dev-qa-db-fra.com

Java: un tableau à deux dimensions est stocké dans l'ordre des colonnes ou des lignes?

En Java, un tableau multidimensionnel est-il stocké dans l'ordre des colonnes ou des lignes?

41
Zouzias

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.

78
T.J. Crowder

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

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.

  • Les tableaux de tableaux peuvent être irréguliers - les tableaux membres peuvent avoir des longueurs différentes.
  • Les membres d'un tableau externe sont des références et peuvent être nuls.
  • Le clonage d'un tableau externe est superficiel - les tableaux membres sont partagés entre l'original et le clone.

À 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.

4
Andy Thomas