IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Initialisation "statique" d'une ArrayList ?


Sujet :

Collection et Stream Java

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut Initialisation "statique" d'une ArrayList ?
    Bonjour, je suis nouveau à Java et je viens de C++... donc j'ai peut etre un mauvais reflexe mais je souhaiterai créer une liste qui fait 8 éléments, ni plus ni moins. Je fais donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private ArrayList<String> grid = new ArrayList<String>(8) ;
    La javadoc :
    ArrayList(int initialCapacity)
    Constructs an empty list with the specified initial capacity.
    Je m'attends donc à avoir une liste pouvant accueillir 8 éléments. En débug: size = 0 par contre grid.elementData contient bien 8 éléments tous mis à null.

    Mais alors, quand je fais
    j'ai un OutOfBoundException.

    Je ne comprends pas, mon slot 0 est pourtant bien alloué...

    Merci pour votre aide.

  2. #2
    Membre averti
    Homme Profil pro
    Java
    Inscrit en
    Mai 2011
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 170
    Points : 444
    Points
    444
    Par défaut
    Bonjour,

    Tu remarqueras que dans le constructeur de ArrayList il y a ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
           public ArrayList(int initialCapacity) {
             super();
             if (initialCapacity < 0)
                throw new IllegalArgumentException("Illegal Capacity: "+
                                                   initialCapacity);
    	 this.elementData = new Object[initialCapacity];
           }
    Et donc que nulle part il change la valeur de size.

    Dans la méthode set :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
          public E set(int index, E element) {
    	RangeCheck(index);
     
    	E oldValue = (E) elementData[index];
    	elementData[index] = element;
    	return oldValue;
          }
    La méthode RangeCheck(index) va regarder que ce que tu veux insérer peut être insérer là où tu le désire (d’ailleurs c'est elle qui te produit ton exception).

    Ici c'est que tu initialises une ArrayList avec comme taille de 8 mais certainement pas prêtre à accueillir tes éléments, simplement que la taille est réservée mais pas allouée. (ça permet une optimisation quand on connait le nombre d'éléments au maximum qu'on aura au niveau du temps d'exécution (évite des multiples réalloc ^^ )).

    Il te faut utiliser la méthode add de ArrayList pour y ajouter des éléments dedans ;-)

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Ou pour le dire autrement, il confond List et tableau.

    Une List est de taille variable, elle peut donc toujours contenir 8 éléments ou 12 ou 160 ou n'importe.
    Mais sa taille n'est jamais que ce qu'elle contient, et elle ne contient qu'autant d'éléments qu'on y a mis. Tant qu'on a rien mis dedans elle contient zéro élément, et sa taille est zéro. Même si elle peut accueillir mille éléments quand on se décidera à les lui donner.

    new ArrayList<String>(8) signifie créer une List qui fonctionne à base de tableau, et faire en sorte que le tableau soit assez grand pour contenir 8 éléments sans avoir besoin d'allouer un nouveau tableau.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Merci pour vos réponses.
    J'ai initialisé ma liste de la sorte pour m'en sortir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grid = Arrays.asList(new String[8]);

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Bon, mais... À quoi ça te sert d'avoir une List, alors ?

    Pourquoi pas juste grid = new String[8]; ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo