Question Définir la méthode de ArrayList émettant une exception IndexOutOfBoundsException


En travaillant sur ArrayList, J'ai trouvé après avoir défini la taille initiale du tableau en utilisant le constructeur avec initialCapacity, puis utilisez set() lancera une exception bien que le tableau soit créé, mais la taille n'est pas définie correctement.

En utilisant ensureCapacity() ne fonctionnera pas non plus car il est basé sur le elementData tableau au lieu de size.

Il y a d'autres effets secondaires à cause de la statique DEFAULT_CAPACITY avec ensureCapacity().

La seule façon de faire ce travail est d'utiliser add () autant de fois que nécessaire après avoir utilisé le constructeur.

Veuillez vérifier le code ci-dessous.

import java.util.ArrayList;
import java.util.List;

public class Test {

public static void main(String[] args) {

    List test = new ArrayList(10);
    test.set(5, "test");
    System.out.println(test.size());
}

Je ne suis pas sûr pourquoi Java jette cette exception.

Comportement Je m'attendais à: test.size() devrait retourner 10 et set (5, ...) devrait fonctionner.

ACTUAL: lance une exception IndexOutOfBoundsException.

Alors, est-ce que c'est la méthode qui pose problème?


11
2017-12-30 09:12


origine


Réponses:


test.set(5, "test"); est la déclaration qui lance cette exception, puisque votre ArrayList est vide (size() retournerais 0 si vous êtes arrivé à cette déclaration), et vous ne pouvez pas définir le iième élément s'il ne contient pas déjà une valeur. Vous devez ajouter au moins 6 éléments à votre ArrayList afin de test.set(5, "test"); pour être valable.

new ArrayList(10) ne crée pas un ArrayList dont la taille est 10. Il crée un vide ArrayList dont la capacité initiale est de 10.


19
2017-12-30 09:14



L'exception n'est pas lancée par test.size() mais test.set(5, "test");. C'est parce que vous définissez un élément à l'index 5 mais la liste est actuellement vide.

List test = new ArrayList(10);

ne crée pas une liste initialisée avec 10 null éléments. Il crée une liste ayant une capacité initiale de 10 éléments, c’est-à-dire que le tableau de sauvegarde a une taille de 10, mais la liste elle-même est toujours vide.

Si vous voulez initialiser une liste avec 10 null éléments, vous pouvez utiliser

List<String> list = new ArrayList<>(Collections.nCopies(10, null));

En guise de note, vous ne devriez jamais utiliser de types bruts comme List mais préférez toujours une liste paramétrée.


8
2017-12-30 09:17



Ma compréhension après avoir parcouru Docs.

La capacité initiale est la longueur du tableau utilisé pour contenir des éléments de la liste. Cela peut être utilisé pour contrôler la mémoire et redimensionner le comportement.

La capacité initiale ne contrôle pas la taille réelle de la liste (#elements dans la liste) ni les valeurs par défaut des éléments. La taille d'une ArrayList après avoir été construite avec une capacité initiale sera toujours égale à zéro.


4
2017-12-30 09:22



List test = new ArrayList(10); crée une liste vide qui aurait une capacité de 10 éléments. Elle ne contient pas d'élément en 6ème position, vous ne pourrez donc pas définir d'élément à cette position.


3
2017-12-30 09:54



List test = new ArrayList(10); crée vide  ArrayList des types bruts (Object) avec capacité initiale (capacité initiale de la liste, initialiser le tableau interne de longueur 10) à ne pas confondre avec la taille (nombre de liste d'éléments contient).

Pour mieux comprendre la première note que ArrayList n'est rien d'autre manipulation de tableau pour changer dynamiquement la taille du tableau que nous ne pouvions pas faire directement avec le tableau. En fin de compte, c'est un intelligent tableau.

En mettant capacité initiale nous disons ArrayList créer la taille du tableau 10 initialement (par défaut la capacité initiale est 10).

C'est ce que fait le constructeur,

public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];//creates initial array
}

Vous pouvez l’augmenter ou la diminuer en conséquence, vous êtes certain que vous allez avoir besoin de la liste avec 20 éléments il vaudra mieux définir la capacité initiale au départ. Ça évite redimensionnement de tableau si vous êtes sûr du nombre minimum d'éléments que vous aurez certainement dans la liste.

test.set(5, "test"); méthode remplace élément à la position spécifique ici, il va remplacer l'élément à l'index 5 avec test. Mais notre liste est vide, elle n'a aucun élément.

La documentation de cette méthode dit:

IndexOutOfBoundsException - si la index est hors de portée (index < 0  || index >= size())

Notez que la taille de la liste est 0 donc index (5) est supérieure à la taille (0).


2
2017-12-30 16:41



Remplace l'élément à la position spécifiée dans cette liste par l'élément spécifié.

set

Paramètres

indice int: index de l'élément à remplacer

élément E: élément à stocker à la position spécifiée

Résultats E l'élément précédemment à la position spécifiée

Jette

IndexOutOfBoundsException

0
2017-10-21 13:05