Utilisation de petites collections (1 à 10 éléments) au niveau de l'instance en Java

StackOverflow https://stackoverflow.com/questions/57145

  •  09-06-2019
  •  | 
  •  

Question

Lors de la création de classes en Java, je me retrouve souvent à créer des collections au niveau de l'instance dont je sais à l'avance qu'elles seront très petites - moins de 10 éléments dans la collection.Mais je ne connais pas le nombre d'éléments à l'avance, j'opte donc généralement pour une collection dynamique (ArrayList, Vector, etc.).

class Foo
{
  ArrayList<Bar> bars = new ArrayList<Bar>(10);
}

Une partie de moi ne cesse de me répéter que c'est du gaspillage d'utiliser des collections dynamiques complexes pour quelque chose d'aussi petit.Existe-t-il une meilleure façon de mettre en œuvre quelque chose comme ça ?Ou est-ce la norme ?

Notez que je ne suis soumis à aucune pénalité de performance (notable) ou quoi que ce soit du genre.C'est juste que je me demande s'il n'y a pas une meilleure façon de faire les choses.

Était-ce utile?

La solution

Le ArrayList la classe en Java n'a que deux données membres, une référence à un Object[] tableau et une taille - dont vous avez de toute façon besoin si vous n'utilisez pas de ArrayList.Donc le seul avantage de ne pas utiliser de ArrayList enregistre une allocation d'objet, ce qui ne sera probablement jamais un gros problème.

Si vous créez et supprimez de très nombreuses instances de votre classe conteneur (et par extension votre ArrayList exemple) chaque seconde, vous pourrait Vous avez un léger problème avec le taux de désabonnement du garbage collection, mais c'est un sujet de préoccupation si jamais cela se produit.La collecte des déchets est généralement le moindre de vos soucis.

Autres conseils

Par souci de simplicité, je pense que ce n’est pratiquement pas un problème.Votre implémentation est suffisamment flexible pour que si les exigences changent à l'avenir, vous ne soyez pas obligé de procéder à une refactorisation.De plus, ajouter plus de logique à votre code pour une solution hybride n'en vaut tout simplement pas la peine, compte tenu de votre petit ensemble de données et de la haute qualité de l'API Collection de Java.

Collections Google a des collections optimisées pour un nombre immuable/petit d’éléments.Voir Lists.asList API à titre d'exemple.

Les frais généraux sont très faibles.Il est possible d'écrire une liste de tableaux hybrides comportant des champs pour les premiers éléments, puis de revenir à l'utilisation d'un tableau pour une liste plus longue.

Vous pouvez éviter entièrement la surcharge de l’objet liste en utilisant un tableau.Pour aller encore plus loin, vous pouvez déclarer le champ comme Objet et éviter complètement le tableau pour un seul élément.

Si la mémoire pose réellement un problème, vous souhaiterez peut-être oublier d’utiliser des instances d’objets de bas niveau.Utilisez plutôt une structure de données plus grande avec un niveau de granularité plus élevé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top