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 :

Référence dans HashMap et MultiKey


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Points : 63
    Points
    63
    Par défaut Référence dans HashMap et MultiKey
    Bonjour,

    Je souhaiterais utiliser une HashMap donc les clé seraient de type MultiKey. Cependant, il serait nécessaire que les objets utilisés pour définir les MultiKey ne soient pas clonés. Je cherche à savoir si cela est possible ou non.

    Pour rendre les choses plus claires. Voici un petit exemple.

    J'ai une première classe Tableau qui contient un tableau d'entiers de grande taille (et qui prend donc une certaine place en mémoire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Tableau{
     
      private int[][] tableau;
      ...
    }
    J'ai ensuite, une deuxième classe contenant un attribut de type ArrayList<Tableau>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class ArrayDeTableaux{
     
      private ArrayList<Tableau> arrayListDeTableau;
      ...
    }
    Je souhaiterais avoir une structure de données me permettant de stocker une distance entre tous les éléments de arrayListDeTableau. C'est pourquoi j'ai pensé à une HashMap dont la clé serait un couple d'objets Tableau. Je pourrais utiliser cette HashMap de la façon suivante pour ajouter ou récupérer un élément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HashMap<MultiKey, Integer> distances = new HashMap<MultiKey, Integer>();
     
    Tableau t1 = new Tableau();
    Tableau t2 = new Tableau();
     
    // Ajouter un element
    distances.put(new MultiKey(t1, t2), 10); // ie la distance entre t1 et t2 est egale a 10
     
    // Recuperer un element
    System.out.println("Distance entre t1 et t2 = " + distances.get(new MultiKey(t1, t2)));
    Comme les objets Tableau sont coûteux en espace mémoire, je souhaiterais qu'ils ne soient pas dupliqués lors de la création du MultiKey ou de l'ajout dans la HashMap.

    Est-ce que vous pourriez me dire si une utilisation telle que celle de l'exemple du dessus passera uniquement par des références ou si cela entraînera le clonage d'objets Tableau ?
    Le cas échéant, y aurait-il une façon qu'il n'y ai pas de clonage ? (dans la javadoc de MultiKey, il est fait mention de clonage mais je ne suis pas sûr de bien comprendre -> lien)

    Merci d'avance pour votre attention ! Si quelque chose n'est pas clair, n'hésitez pas à me demander de préciser certains points.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Il n'y a pas clonage.

    Ce qu'on insère dans les collections standards Java n'est jamais cloné automatiquement. Ce qui est normal, car beaucoup de classes ne permettent pas de cloner leurs instances.
    C'est la raison pour laquelle la JavaDoc de Map indique que les clés d'une Map devraient de préférence être immutables, et si elles ne le sont pas, elles doivent absolument ne jamais être modifiées tant qu'on se sert de la Map.

    Le même raisonnement s'applique avec le MultiKey d'Apache.
    La JavaDoc ne propose de cloner que quand on construit une MultiKey avec un tableau de clés (pas deux clés, pas trois clés, un tableau de clés. Ça ne te concerne pas, puisque toi tu utilises deux clés.) Un tableau étant mutable, c'est en principe peu recommandé pour faire des clés. MultiKey propose de copier ce tableau avant de s'en servir comme clé, pour limiter les risques. Mais attention : un nouveau tableau de clés est créé, oui, mais c'est seulement le tableau de clés. Les références qu'il contient ne sont pas clonées : les deux tableaux contiendront les références vers les mêmes objets. Normal, encore une fois, puisque tout n'est pas clonable.

    Note : ces questions mises à part, ta classe Tableau doit redéfinir correctement les méthodes hashCode() et equals(), sinon elle ne peut pas servir de clé.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    Ok, parfait.

    Merci bien.

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

Discussions similaires

  1. Prob de référence dans VBA???
    Par electrosat03 dans le forum Access
    Réponses: 3
    Dernier message: 18/02/2006, 00h03
  2. Ajouter une référence dans un runtime
    Par rogger dans le forum Runtime
    Réponses: 13
    Dernier message: 07/12/2005, 17h20
  3. modifier la table de référence dans un état
    Par floune dans le forum Access
    Réponses: 3
    Dernier message: 20/11/2005, 16h51
  4. Réponses: 10
    Dernier message: 24/09/2005, 19h19
  5. Tables de référence dans un MCD
    Par MomoZeAsticot dans le forum Schéma
    Réponses: 6
    Dernier message: 21/02/2005, 14h37

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