122 votes

Tableaux à longueur variable (dynamiques) en Java

Je me demandais comment initialiser un tableau d'entiers de telle sorte que sa taille et ses valeurs changent tout au long de l'exécution de mon programme, des suggestions ?

133voto

Pops Points 10137

Oui : utiliser Liste de tableaux .

En Java, les tableaux "normaux" sont de taille fixe. Vous devez leur donner une taille et vous ne pouvez pas les étendre ou les contracter. Pour modifier la taille, vous devez créer un nouveau tableau et copier les données que vous souhaitez, ce qui est inefficace et fastidieux.

Heureusement, il existe toutes sortes de classes intégrées qui mettent en œuvre les structures de données courantes, ainsi que d'autres outils utiles. Vous pouvez consulter l'API Java 6 pour en obtenir la liste complète.

Une mise en garde : ArrayList ne peut contenir que des objets (par exemple, des entiers), et non des primitives (par exemple, des ints). Dans la plupart des cas, autoboxing/autounboxing s'en chargera silencieusement pour vous, mais vous pourriez obtenir un comportement bizarre en fonction de ce que vous faites.

2 votes

Je me demande pourquoi le code suivant est correct en java ? int[] array = new int[size]; size est une variable, mais la longueur d'un tableau doit être fixe, ai-je raison ? @Lord Torgamus

13 votes

@jerry_sjtu oui, le tableau ne change pas de taille pour s'adapter size au fur et à mesure que le programme avance ; il obtient la taille qui se trouve dans size lorsque cette ligne est exécutée.

0 votes

Chaque fois que je supprime un élément d'une ArrayList, je me retrouve avec un élément de type null à la fin. Vous savez pourquoi ?

42voto

MattGrommes Points 3943

Les tableaux en Java ont une taille fixe. Ce dont vous avez besoin, c'est d'une ArrayList, l'une des nombreuses collections extrêmement précieuses disponibles en Java.

Au lieu de

Integer[] ints = new Integer[x]

vous utilisez

List<Integer> ints = new ArrayList<Integer>();

Ensuite, pour modifier la liste, vous utilisez ints.add(y) y ints.remove(z) parmi de nombreuses autres méthodes pratiques que vous pouvez trouver dans les Javadocs appropriées.

Je recommande vivement d'étudier les classes Collections disponibles en Java, car elles sont très puissantes et vous offrent de nombreuses fonctionnalités intégrées que les débutants en Java ont tendance à essayer de réécrire eux-mêmes inutilement.

0 votes

Veulent travailler jusqu'à ce que j'essaie : List<Integer> ints = new ArrayList<Integer>() ;

5 votes

Pourquoi utilisez-vous List<Integer> au lieu de ArrayList<Integer> ?

27voto

Mnementh Points 19831

Les tableaux ont une taille fixe une fois instanciés. Vous pouvez utiliser une liste à la place.

Les boîtes automatiques rendent une liste utilisable de la même manière qu'un tableau, vous pouvez y mettre simplement des valeurs d'entrée :

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

2 votes

Pourquoi déclarez-vous une variable de référence de type List, et non ArrayList ?

2 votes

Comme elle permet de passer simplement d'une implémentation de liste à l'autre si nécessaire, il suffit de modifier la nouvelle XYZList(). Si la variable est déclarée comme ArrayList, vous risquez d'utiliser des méthodes spécifiques à cette implémentation, ce qui rendra le changement plus compliqué.

1 votes

Merci, je comprends.

12voto

cspann Points 80

Je ne suis pas d'accord avec les réponses précédentes qui suggèrent ArrayList porque ArrayList es no un tableau dynamique mais une liste soutenue par un tableau. La différence est que vous ne pouvez pas faire ce qui suit :

ArrayList list = new ArrayList(4);
list.put(3,"Test");

Il vous donnera une IndexOutOfBoundsException parce qu'il n'y a pas encore d'élément à cette position, même si le tableau de base permet un tel ajout. Vous devez donc utiliser une implémentation de tableau extensible personnalisée, comme suggéré par @randy-lance.

0 votes

Je crois que vous vouliez le lier à codereply.com/answer/6i5bur/java-dynamic-arrays.html

0 votes

Je ne suis pas sûr que ArrayList ait une méthode put comme je le vois dans le code source de Java8. J'essaie juste de savoir comment il se comporte avec une capacité donnée. Cependant, j'ai trouvé la méthode ArrayList.add().

7voto

Hao Deng Points 129
  1. Il est recommandé d'utiliser la liste pour traiter les petites tailles.

  2. Si vous avez un grand nombre de numéros, JAMAIS utiliser List et autoboxing,

    Liste< Integer> liste

Pour chaque int, un nouvel Integer est créé automatiquement. Vous constaterez que cela devient lent lorsque la taille de la liste augmente. Ces Integers sont des objets inutiles. Dans ce cas, il serait préférable d'utiliser une taille estimée,

int[] array = new int[ESTIMATED_SIZE];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X