web-dev-qa-db-fra.com

Capacité d'ArrayList

Duplicata possible:
Comment obtenir la capacité de la ArrayList en Java?

Comment trouver la capacité d'un ArrayList?

31
user430532

Je suis curieux, pourquoi en avez-vous besoin? Vous devez savoir que la capacité n'est pas (comme cela peut paraître) une limite supérieure de la quantité que vous pouvez mettre dans ArrayList . C'est une valeur représentant la quantité de données que vous pouvez mettre dans la liste, sans la forcer à réallouer son tableau interne. Fondamentalement, la notion de capacité n'est là que pour vous permettre de modifier légèrement les performances.

Quoi qu'il en soit, vous le savez peut-être déjà, alors voici la vraie réponse.

L'interface fournie par l'API pour ArrayList simplement ne prend pas en charge un tel cas d'utilisation . Il y a plusieurs raisons à cela. L'une des raisons est que vous ne devriez pas vous en soucier. L'ArrayList doit être considéré comme un tableau illimité qui s'éloigne de détails tels que la capacité.

Le meilleur moyen de contrôler la capacité est d'utiliser le constructeur ArrayList(int initialCapacity) , et les deux méthodes trimToSize() et ensureCapacity(int minCapacity) .

Pour le plaisir cependant, j'ai réussi à le résoudre à travers un laid-hack de réflexion (ne l'utilisez pas):

import Java.lang.reflect.Field;
import Java.util.ArrayList;
public class Test {

    public static void main(String[] args) throws Exception {
        ArrayList<Integer> list = new ArrayList<Integer>(3);
        for (int i = 0; i < 17; i++) {
            list.add(i);
            System.out.format("Size: %2d, Capacity: %2d%n",
                              list.size(), getCapacity(list));
        }
    }

    static int getCapacity(ArrayList<?> l) throws Exception {
        Field dataField = ArrayList.class.getDeclaredField("elementData");
        dataField.setAccessible(true);
        return ((Object[]) dataField.get(l)).length;
    }
}

Sortie:

Size:  1, Capacity:  3
Size:  2, Capacity:  3
Size:  3, Capacity:  3
Size:  4, Capacity:  5
Size:  5, Capacity:  5
Size:  6, Capacity:  8
Size:  7, Capacity:  8
Size:  8, Capacity:  8
Size:  9, Capacity: 13
Size: 10, Capacity: 13
Size: 11, Capacity: 13
Size: 12, Capacity: 13
Size: 13, Capacity: 13
Size: 14, Capacity: 20
Size: 15, Capacity: 20
Size: 16, Capacity: 20
Size: 17, Capacity: 20
72
aioobe

Non vous ne pouvez pas ! Java ArrayList ne fournit pas un moyen d'accéder à sa capacité actuelle.

Vous pouvez uniquement construire une ArrayList spécifiant une capacité initiale à l'aide du constructeur ArrayList (int initialCapacity) ou augmenter la capacité en appelant assureCapacity () .

19
Gopi

ArrayList est une abstraction pour un List d'éléments pouvant être agrandi automatiquement. Vous avez rarement besoin de connaître sa capacité. Considérez Efficace Java 2nd Edition, Item 52: Reportez-vous aux objets par leurs interfaces . Autant que possible, vous devriez même pas si c'est un ArrayList ou un LinkedList, c'est juste un List.

Cela dit, ces méthodes peuvent vous intéresser:

  • ArrayList(int initialCapacity)
    • Construit une liste vide avec la capacité initiale spécifiée.
  • void ensureCapacity(int minCapacity)
    • Augmente la capacité de cette instance ArrayList, si nécessaire, pour garantir qu'elle peut contenir au moins le nombre d'éléments spécifié par l'argument de capacité minimale.
  • void trimToSize()
    • Ajuste la capacité de cette instance ArrayList à la taille actuelle de la liste. Une application peut utiliser cette opération pour minimiser le stockage d'une instance ArrayList.
10
polygenelubricants

Vous n'avez pas à vous soucier de la capacité, c'est un détail d'implémentation interne. Si le tableau interne se remplit, il s'agrandira. Vous pouvez savoir combien d'éléments sont actuellement dans votre ArrayList avec la méthode size().

1
Noel M

D'après la spécification: "La capacité est la taille du tableau utilisé pour stocker les éléments dans la liste. Elle est toujours au moins aussi grande que la taille de la liste. Lorsque des éléments sont ajoutés à une liste de tableaux, sa capacité augmente automatiquement. Les détails de la politique de croissance n'est pas précisée au-delà du fait que l'ajout d'un élément a un coût temporel amorti constant. "

Il n'y a donc aucun moyen de dire quelle est la capacité actuelle, ni comment elle augmente.

1
Jeroen Rosenberg

Je vais inverser la tendance ici ... l'utilisateur a une question mais sans contexte. Sans contexte, il n'est pas nécessaire de connaître la capacité, car la gamme de supports se développera pour s'adapter ...

Vous pouvez effectuer les opérations suivantes pour savoir avec certitude quelle est la capacité de votre ArrayList. L'effet secondaire est que le tableau de support sera coupé au nombre exact d'éléments dans le tableau:

ArrayList list = new ArrayList();
//add a bunch of elements
list.trimToSize();
System.out.println("Capacity = " + list.size());

Prendre plaisir!

1
Tim Reddy

Avez-vous besoin de cela au moment de l'exécution ou est-il correct de l'obtenir lors de l'exécution des tests? Si son test, vous pouvez généralement voir la capacité en utilisant votre débogueur préféré IDE. Je n'ai pas le nombre exact, mais 1,7 est généralement la taille de croissance de la capacité. Donc, si vous créez un tableau avec 10 items, Java fera de la taille 17.

0
Steve

L'API ne le fournit pas. En interne, la capacité est multipliée par un facteur chaque fois que add (..) est appelé en pleine capacité. Cependant, la spécification Java ne dit rien sur ce facteur constant ... L'implémentation de Sun utilise un facteur de 1,5, vous avez donc une limite supérieure de 1,5 * size () pour la capacité.

N'oubliez pas que vous pouvez utiliser trimToSize () pour "compacter" la liste et rendre la capacité égale à size ().

0
Eyal Schneider