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 :

Question de performance avec les HashMap


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut Question de performance avec les HashMap
    Bonjour à tous,

    Voici mon problème: je dispose d'une HashMap<String, ArrayList<Integer> et j'ai besoin de temps en temps de modifier une valeur au milieu de l'ArrayList.

    Or, je ne connais que la méthode put pour ce faire, mais le problème, c'est que si j'utilise put, je suis obligé d'écraser toute la ArrayList avec une nouvelle ArrayList, la même, mais avec une seule valeur modifiée.

    Et je soupçonne qu'au niveau des performances, ce ne soit pas le top, surtout que cette ArrayList contient plusieurs centaines de milliers de valeurs et que j'ai besoin de le faire dans une boucle qui tourne plusieurs centaines de milliers de fois.

    Auriez-vous une autre suggestion sans modifier la structure des HashMap?
    PS: j'ai dit ici que c'est une ArrayList, mais c'est en fait un objet customisé qui hérite des ArrayList.

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Le passage de variable en java se fait par référence mais pas par valeur, donc si modifie un élément de l'ArrayList que tu as ajouté au HashMap, c'est déjà bon. Tu n'as plus besoin d'écraser la liste du map. Même si tu fais un put, cela ne changera rien s'il s'agit du même instance de l'ArrayList.

    A+.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut
    Merci pour ta réponse. Comment je peux faire sans écraser l'ArrayList comme tu dis?
    Surtout qu'il faille que je récupère l'ArrayList au préalable pour la modifier...
    Donc je suis obligé d'utiliser une nouvelle variable de type ArrayList!

  4. #4
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Donc je suis obligé d'utiliser une nouvelle variable de type ArrayList!
    Si tu as toujours la variable de départ, non, tu n'as qu'à modifier seulement l'élément que tu veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    List<Machin> list = new ArrayList<Machin>();
    Machin x = new Machin();
    list.add(x);
    tonHashMap.put("cle",list);
    x.setMachin("test");//C'est bon
    //Mais si n'est pas une variable pointant sur l'objet, mais seulement la liste
    Machin y = list.get(index);
    y.setPropriete("propriete") ; // c'est bon 
    //Dans le cas ou tu n'as plus la variable que tu as inséré
    List a = tonHashMap.get("cle");
    Machin b = a.get(index);
    b.setPropriete("valeur"); // c'est bon
    A+.

  5. #5
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Et même s'il n'a plus la variable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    List<Machin> uneListe = tonHashMap.get("cle");
    if (null == uneListe) {
      uneListe = new ArrayList<Machin>();
      tonHashMap.("cle", uneListe);
    }
     
    uneListe.add("unTruc");
    Une liste n'est pas immutable, donc aucune contre-indication à modifier celle qui est dans la Hashmap, au contraire et ne surtout pas faire un nouveau put qui ne servirait à rien.

    Bulbo

    [Edit] En même temps si j'avais mieux lu, déjà proposé par andry.aime donc mon post est inutile
    [/Edit]
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut
    Merci à tous pour ces super explications.

    En effet, quand je fais hashmap.get(key).set(monIndex, maValeur), la modification se fait bien dans la HashMap. Je croyais que get générait une "copie" en mémoire de l'ArrayList à modifier et ne modifiait que celle-ci, mais en fait non.

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

Discussions similaires

  1. Question d'élégance avec les templates.
    Par Agoudard dans le forum C++
    Réponses: 16
    Dernier message: 26/12/2010, 13h53
  2. Problème de performance avec les chunkedInputStream
    Par salimoo dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 02/08/2010, 19h33
  3. [Delphi 7] Questions pour débuter avec les bases de données
    Par DamKre dans le forum Bases de données
    Réponses: 6
    Dernier message: 25/09/2007, 16h06
  4. problemes de performances avec les requetes select
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/07/2003, 13h39
  5. problemes de performances avec les requetes select
    Par berry dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 10/07/2003, 13h39

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