Java Language Comment changez-vous la taille d'un tableau?


Exemple

La réponse simple est que vous ne pouvez pas faire cela. Une fois qu'un tableau a été créé, sa taille ne peut plus être modifiée. Au lieu de cela, un tableau ne peut être "redimensionné" qu'en créant un nouveau tableau avec la taille appropriée et en copiant les éléments du tableau existant vers le nouveau.

String[] listOfCities = new String[3];   // array created with size 3.
listOfCities[0] = "New York";
listOfCities[1] = "London";
listOfCities[2] = "Berlin";

Supposons (par exemple) qu'un nouvel élément listOfCities être ajouté au tableau listOfCities défini ci-dessus. Pour ce faire, vous devrez:

  1. créer un nouveau tableau de taille 4,
  2. copier les 3 éléments existants de l'ancien tableau dans le nouveau tableau aux décalages 0, 1 et 2, et
  3. ajouter le nouvel élément au nouveau tableau à l'offset 3.

Il y a plusieurs façons de faire ce qui précède. Avant Java 6, le moyen le plus concis était le suivant:

String[] newArray = new String[listOfCities.length + 1];
System.arraycopy(listOfCities, 0, newArray, 0, listOfCities.length);
newArray[listOfCities.length] = "Sydney";

A partir de Java 6, les méthodes Arrays.copyOf et Arrays.copyOfRange peuvent le faire plus simplement:

String[] newArray = Arrays.copyOf(listOfCities, listOfCities.length + 1);
newArray[listOfCities.length] = "Sydney";

Pour d'autres moyens de copier un tableau, reportez-vous à l'exemple suivant. Gardez à l'esprit que vous devez disposer d'une copie de tableau de longueur différente de l'original lors du redimensionnement.

Une meilleure alternative au redimensionnement de tableau

Il y a deux inconvénients majeurs à redimensionner un tableau comme décrit ci-dessus:

  • C'est inefficace. Pour agrandir un tableau (ou le rendre plus petit), copiez tous les éléments de tableau existants ou tous les allouez et allouez un nouvel objet de tableau. Plus la matrice est grande, plus elle est chère.
  • Vous devez pouvoir mettre à jour toutes les variables "live" contenant des références à l'ancien tableau.

Une alternative consiste à créer le tableau avec une taille suffisante pour commencer. Ceci n'est viable que si vous pouvez déterminer cette taille avec précision avant d'allouer le tableau . Si vous ne pouvez pas faire cela, le problème de redimensionnement du tableau se pose à nouveau.

L'autre solution consiste à utiliser une classe de structure de données fournie par la bibliothèque de classes Java SE ou une bibliothèque tierce. Par exemple, la structure «collections» de Java SE fournit un certain nombre d'implémentations des API List , Set et Map avec différentes propriétés d'exécution. La classe ArrayList se rapproche le plus des caractéristiques de performance d'un tableau brut (par exemple, recherche O (N), obtention et définition de O (1), insertion et suppression aléatoires O (N)) tout en offrant un redimensionnement plus efficace.

(L'efficacité du redimensionnement pour ArrayList provient de sa stratégie consistant à doubler la taille de la matrice de sauvegarde sur chaque redimensionnement. Dans le cas d'un cas typique, cela signifie que vous ne redimensionnez que occasionnellement. par insert est O(1) . Il peut être possible d'utiliser la même stratégie lors du redimensionnement d'un tableau brut.)