La capacité d'un ArrayList par rapport à la taille d'un tableau en Java

1. Vue d'ensemble

Java nous permet de créer des tableaux de taille fixe ou d'utiliser des classes de collection pour faire un travail similaire.

Dans ce didacticiel, nous allons examiner la différence entre la capacité d'un ArrayList et la taille d'un Array.

Nous examinerons également des exemples de moments où nous devrions initialiser ArrayList avec une capacité et les avantages et inconvénients en termes d'utilisation de la mémoire.

2. Exemple

Pour comprendre les différences, essayons d'abord les deux options.

2.1. Taille d'un tableau

En java, il est obligatoire de spécifier la taille d'un tableau lors de la création d'une nouvelle instance de celui-ci:

Integer[] array = new Integer[100]; System.out.println("Size of an array:" + array.length);

Ici, nous avons créé un tableau I nteger de taille 100, qui a abouti à la sortie ci-dessous

Taille d'un tableau: 100

2.2. Capacité d'une ArrayList

Maintenant, créons une ArrayList avec une capacité initiale de 100:

List list = new ArrayList(100); System.out.println("Size of the list is :" + list.size());
La taille de la liste est: 0

Comme aucun élément n'a encore été ajouté, la taille est de zéro.

Maintenant, ajoutons un élément à la liste et vérifions sa taille:

list.add(10); System.out.println("Size of the list is :" + list.size());
La taille de la liste est: 1

3. Taille des tableaux par rapport à ArrayList

Vous trouverez ci-dessous quelques différences majeures entre la taille d'un tableau et la capacité d'un ArrayList.

3.1. Modification de la taille

Les tableaux sont de taille fixe. Une fois que nous initialisons le tableau avec une valeur int comme taille, il ne peut pas changer. La taille et la capacité sont également égales.

La taille et la capacité de ArrayList ne sont pas fixes. La taille logique de la liste change en fonction de l'insertion et de la suppression des éléments qu'elle contient. Ceci est géré séparément de sa taille de stockage physique. De même, lorsque le seuil decapacité ArrayList est atteint, il augmente sa capacité pour faire de la place pour plus d'éléments.

3.2. Allocation de mémoire

La mémoire du tableau est allouée lors de la création. Lorsque nous initialisons un tableau, il alloue la mémoire en fonction de la taille et du type d'un tableau. Il initialise tous les éléments avec une valeur nulle pour les types référence et la valeur par défaut pour les types primitifs.

ArrayList modifie l'allocation de mémoire à mesure qu'elle augmente. Lorsque nous spécifions la capacité lors de l'initialisation de ArrayList , il alloue suffisamment de mémoire pour stocker des objets jusqu'à cette capacité. La taille logique reste 0. Lorsqu'il est temps d'étendre la capacité, un nouveau tableau plus grand est créé et les valeurs y sont copiées.

Nous devrions noter qu'il existe un tableau singleton spécial de taille 0 pour les objets ArrayList vides , ce qui les rend très bon marché à créer. Il convient également de noter que ArrayList utilise en interne un tableau de références Object.

4. Quand initialiser ArrayList avec Capacity

Nous pouvons nous attendre à initialiser la capacité d'un ArrayList lorsque nous connaissons sa taille requise avant de le créer, mais ce n'est généralement pas nécessaire. Cependant, il y a quelques raisons pour lesquelles cela peut être la meilleure option.

4.1. Construire une grande ArrayList

Il est bon d'initialiser une liste avec une capacité initiale quand on sait qu'elle va grossir. Cela évite certaines opérations de croissance coûteuses lorsque nous ajoutons des éléments.

De même, si la liste est très longue, les opérations de croissance automatique peuvent allouer plus de mémoire que nécessaire pour la taille maximale exacte. En effet, la quantité à augmenter à chaque fois est calculée en proportion de la taille jusqu'à présent. Donc, avec de grandes listes, cela pourrait entraîner un gaspillage de mémoire.

4.2. Petit immeuble Plusieurs ArrayList s

Si nous avons beaucoup de petites collections, la capacité automatique d'une ArrayList peut fournir un grand pourcentage de mémoire gaspillée. Disons qu'ArrayList préfère une taille de 10 avec un plus petit nombre d'éléments, mais nous n'en stockons que 2 ou 3. Cela signifie 70% de mémoire gaspillée, ce qui pourrait avoir de l'importance si nous avons un grand nombre de ces listes.

La définition initiale de la capacité peut éviter cette situation.

5. Éviter le gaspillage

Nous devons noter qu'ArrayList est une bonne solution pour un conteneur d'objets de taille flexible prenant en charge l'accès aléatoire. Il consomme un peu plus de mémoire qu'un tableau, mais fournit un ensemble d'opérations plus riche.

Dans certains cas d'utilisation, en particulier autour de grandes collections de valeurs primitives, le tableau standard peut être plus rapide et utiliser moins de mémoire.

De même, pour stocker un nombre variable d'éléments qui n'ont pas besoin d'être accédés par index, LinkedList peut être plus performant. Il n'entraîne aucune surcharge de gestion de la mémoire.

6. Résumé

Dans ce court article, nous avons vu la différence entre la capacité de la ArrayList et la taille d'un tableau. Nous avons également examiné le moment où nous devrions initialiser ArrayList avec la capacité et ses avantages en ce qui concerne l'utilisation de la mémoire et les performances.

Comme toujours, l'exemple de code est disponible à l'adresse over sur GitHub.