Java – le meilleur moyen d’implémenter un tableau d’objects de taille dynamic

Je suis un novice avec Java.

Je dois implémenter un tableau d’objects dont la taille change au cours de l’exécution.

Le code que j’écris va également être porté sur Android.

Selon votre expérience, quelle est la meilleure classe pour implémenter cela?

Merci,
Dan

Java a une capacité de modèle inadéquate. Tant que vous voulez un tableau d’objects, alors ArrayList est bon. Pour les primitifs, c’est affreux.

En supposant que vous ayez une hiérarchie d’objects à placer dans une liste, ArrayList est idéal:

 ArrayList vehicles = new ArrayList(); vehicles.add(new Car(...)); vehicles.add(new Truck(...)); 

Je suppose dans l’exemple ci-dessus que Vehicle est la classe de base et que Car et Truck sont des sous-classes.

Par contre, si vous voulez une liste de nombres, Java est très inefficace. Chaque object est une référence (en réalité un pointeur de 4 octets) à un bloc de mémoire de 12 octets, plus ce que vous utilisez réellement. Comme ArrayList ne peut pas s’appliquer à int, cela signifie que créer une liste de nombres signifie:

  1. Création d’une liste de Integer, le wrapper d’object pour int.
  2. Conversion des objects chaque fois que vous extrayez un nombre. Cela se fait automatiquement ces jours-ci, mais cela prend du temps.
  3. Initialisation 5 fois plus de stockage que nécessaire.

Donc, si vous manipulez de gros morceaux de données primitives (int, float, double), cela peut valoir la peine d’écrire votre propre version de ArrayList. Cela est particulièrement important lorsque les données sont volumineuses et que la plate-forme est petite (comme un ordinateur de poche Android).

Comparez ceci:

 ArrayList list = new ArrayList(); for (int i = 0; i < 1000000; i++) list.add(i): 

à:

 public class IntArray { private int[] data; private int used; private void grow() { // implement code to make data double in size here... } public IntArray(int size) { data = new int[size]; used = 0; } public void add(int i) { if (i >= data.length) grow(); data[used++] = i; } } IntArray list2 = new IntArray(1000000); for (int i = 0; i < 1000000; i++) list2.add(i); 

La dernière fois que je l'ai comparé, l'utilisation optimale de la liste de primitives est plus de 10 fois plus rapide que l'utilisation certes sous-optimale de ArrayList. Pour être plus juste, pré-allouez la liste des arraylistes à la bonne taille - c'est toujours beaucoup plus lent.

LinkedList n'est utile que si vous insérez au début ou au milieu d'une liste. Si votre liste est construite en ajoutant à la fin, ArrayList dominera complètement LinkedList. Donc, pour une liste typique d'objects que vous construisez dans l'ordre, ArrayList est ce que vous recherchez. Pour une grande liste de primitives comme int ou double, écrivez votre propre liste.

ArrayList intéresserait probablement ArrayList .

Je pense que même wikipedia a des informations sur l’utilisation de listes génériques en java: http://en.wikipedia.org/wiki/Generics_in_Java

Vous devriez vous familiariser avec le cadre de collecte en java. Vous avez des choses comme Set, List, Map, SortedSets, etc … Ce qui peut être une structure de données vraiment utile.

Cela dépend de ce que vous allez utiliser.

Si vous avez un tableau qui change fréquemment de taille, nous vous recommandons d’utiliser un ArrayList ou quelque chose d’autre du framework de collection (en fonction de l’utilisation que vous allez en faire).

Cependant, si vous avez un tableau qui change de taille très peu fréquemment mais qui est lu fréquemment, il serait probablement plus rapide d’utiliser un tableau normal et de le redimensionner à la place si nécessaire.

 Arrays.copyOf(array, newSize); 

J’espère que cela aide! 🙂