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 :

[Pratiques] Utilisation de HashMap dans une application


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut [Pratiques] Utilisation de HashMap dans une application
    Salut,

    Quels est l'utilisation courante d'un HashMap dans une application ?

    Est-ce qu'on peut l'utiliser comme le conteneur principal (ce qui consomme beaucoup de place mémoire) ou fais t-on des tours de passe-passe avec d'autres conteneurs comme les ArrayList ou Vector ? Ou encore, est-ce qu'on charge les informations directement à partir d'un fichier ou une BDD ?

    Je pose la question parceque l'accès à une HashMap se limite à une clé, ce qui réduit son intérêt au niveau de la recherche d'informations. Personellement, il me semble que cela rends son utilité passagère dans le sens où l'on peut créer une HashMap, la charger et ensuite accélérer la recherche d'informations de manière significative (temps d'accès fixe selon certaines sources).

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    on utilise une hashmap dès qu'on doit stocker des informations auxquelles ont doit accéder par clé, ce qui est son but premier. Exemples:

    configuration du programme, sous forme de clé/valeur
    stockage de paramètres soumis dans une requête web
    .....

    Les Map (et hashmap en particulier) sont très souvent utilisées en pratique, car des lien clé -> valeur sont très souvent nécessaires à tous les niveaux d'un programme.

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut
    Ok. Je suppose qu'il y a un certain avantage au niveau de la vitesse d'accès aussi.

    Prenons la gestion d'une bibliothèque. Pour les emprunts, on pourrais faire un HashMap qui utilise le code isbn comme key. Mais, il est probablement nécessaire d'éffectuer une recherche sur le titre aussi ainsi que l'auteur.

    Que faire dans ce cas ? Est-ce qu'il est possible d'avoir un conteneur central et d'utiliser les données qu'il contient pour créer des HashMap selon les besoins ?

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    tu peux très bien avoir plusieurs hashmap

    isbn -> livre
    auteur -> livre[]
    titre -> livre
    emprunteur -> livres[]

    etc...
    Les hashmap ont une taille proportionnelle au nombre d'entrées qu'elle ont, pas à la taille des entrée.

    Un map qu' contient 50.000 couples clé/valeur aura la même taille (à peu près), quelle que soit les clés / valeurs utilisées

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut
    Donc, on pourrais charger les données dans un Vector ou un ArrayList et transposer les données dans des HashMaps séparées ? Si c'est possible, comment procédes t-on ?

    Je sais qu'on peut faire l'inverse de cette manière ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private HashMap<String, MaClasse> map;
     
    Vector<MaClasse> MesObjets = (Vector<MaClasse>) map.values();

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    un vector ou une List, c'est juste un liste d'item. Pour stocker dans une hashmap, il faut non seulement les valeurs mais aussi des clé. Et ca, java peut pas les inventer, c'est à toi de les créer. Basiquement il faut parcourir ta liste pour ajouter les entrée dans la hasmap sous forme de clé/valeur.

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut
    Bien. Donc, mise à part la recopie, il n'existe pas une opération qui permet de transposer ou d'enrober un autre conteneur avec une HashMap.

    Ou alors, il y a peut être moyen d'établir un HashMap avec des références vers des éléments d'une liste au lieu de reprendre des valeurs ou des objets distincts ? Je doute déjà que cela soit faisable vu que les éléments d'une liste sont gérées en private, d'autant plus que la suppréssion d'un élément risquerais de soulever des incohérences.

    On me demandes d'utiliser une HashMap dans une classe existante où on trouve un Vector. Faut-il supprimer le Vector et le remplacer avec le HashMap ou est-ce qu'on peut faire en sorte que les deux co-existent sans qu'il y ait une redondance d'informations ? Aussi, y a t-il un intérêt à trier le contenu d'une HashMap (affichage) ?

    Voila pourquoi je demande quelle est la pratique la plus courante et surtout la plus acceptable.

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Tu peux supprimer le vector et le remplacer soit par une hashmap soit par un TreeMap, le second garantissant l'ordre de lecture des valeurs identique à celui d'insertion (la hashmap n'a pas d'ordre, la TreeMap si). Aucune classe de base de java ne permet 'd'enrober' un Vectore ou une List dans une HashMap, et pour cause, il manque les clés. Tu peux toujours faire ta propre implémentation de Map, basée sur le vector / list, mais ca pose de problèmes de performance, c'est justement la structure de stockage qui donne les perfs d'une Map.


    Par contre, rien ne t'empeche de maintenir ta Map et tes vector cote à cote. si ce sont des informations privée de la classe. Imaginons (exemple) une classe "Bibliothèque" stockant des "Livres". La classe bibliothèque ayant une méthode addLivre(), une méthode List<Livre> getLivres(), et une méthode Map<String,Livre> getLivresByISBN(), tu pourrais faire ceci dans ta classe bibliothèque.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    ....
    private List<Livre> livres = new ArrayList<Livre>();
    private Map<String,Livre> isbns = new HashMap<String,Livre>();
    ....
    public List<Livre> getLivres() { 
      return Collections.unModifiableList(livres); 
    }
    pubic Map<String,Livre> getLivresbyISBN() { 
      return Collections.unModifiableMap(isbns);
    }
    public void addLivre(Livre l){
        livres.add(l);
        isbns.put(l.getIsbn,l);
    }
    ....

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut
    Selon les besoins, ca pourrais être une bonne idée.

    Une alternative serait de charger le HashMap à la volée. Ce chargement pourrais être déclenché lorsqu'une méthode de recherche sur ISBN est lancée pour la première fois ou de manière anticipative.

    Je pense avoir trouver une solution qui conviendrais et je laisserais les intéressés tirer leurs propres conclusions. Merci pour le retour .

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Juste en passant, le remplaçant de Vector serait plutôt lié à l'interface List (et l'implémentation ArrayList)... Map (et HashMap) remplace plus particulièrement Hashtable...

    Pour ton problème initial, quand tu ajoutes un objet à une Map, tu ne rajoutes que la référence de l'objet. Le fait de créer plusieurs Map sur les mêmes objets ne va pas augmenter l'occupation de la mémoire de la taille des objets référencés mais de la taille de la clé + la taille de la référence.
    Dans l'exemple suivant,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Map<Integer, MonObjet> mapID = new HashMap<Integer, MonObjet>();
    Map<String, MonObjet> mapTEXTE = new HashMap<String, MonObjet>();
    ResultSet rs = stmt.executeQuery(....);
    while (rs.next())
    {
       MonObjet obj = new MonObjet(rs.getInt("ID"), rs.getString("TEXTE"));
       mapID.put(obj.getId(), obj);
       mapTEXTE.put(obj.getTexte(), obj);
    }
    On n'a qu'une allocation de mémoire par objet MonObjet, mais on utilise 2x la référence...

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Le fait de créer plusieurs Map sur les mêmes objets ne va pas augmenter l'occupation de la mémoire de la taille des objets référencés mais de la taille de la clé + la taille de la référence.
    C'est le détail qui m'échappais (à force de parler de conteneurs...). Donc, ce n'est pas vraiment une catastrophe si on utilise plusieurs HashMap. Autant les initialiser dès que l'application est lancée alors.

Discussions similaires

  1. Utilisation de plugin dans une application Web
    Par loopx dans le forum Wildfly/JBoss
    Réponses: 4
    Dernier message: 22/01/2008, 00h06
  2. Comment utiliser un paquet dans une application ?
    Par zizo89 dans le forum Langage
    Réponses: 0
    Dernier message: 21/09/2007, 23h48
  3. Utilisation de GStreamer dans une application
    Par bouncebounce dans le forum C++
    Réponses: 4
    Dernier message: 13/04/2007, 17h44
  4. Utilisation de GStreamer dans une application
    Par bouncebounce dans le forum C
    Réponses: 1
    Dernier message: 13/04/2007, 09h24
  5. Utiliser un timer dans une application console
    Par chavers dans le forum Langage
    Réponses: 8
    Dernier message: 25/05/2005, 15h07

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