Comment obtenir un immuable collection de java table de hachage?
J'ai besoin d'obtenir une collection de java HashMap sans que les modifications dans la carte reflétant dans la collection plus tard . Je voulais utiliser de la Collection.toArray() pour y parvenir , mais sa ne fonctionne pas . La résultante de l'Objet[] est également en train de changer (javadoc dire que Le tableau retourné doit être "sûr" que l'absence de références sont maintenu par cette collection ) . De toute manière simple pour y parvenir?
Je n'ai pas de comprendre clairement ce que vous essayez d'atteindre. Mais est LinkedHashMap ce que vous recherchez?
Non..l'ordre d'insertion n'est pas ce que je recherche . disons que nous avons HashMap de <nom,personne> . la table de hachage.les valeurs de() serait de retour moi une collection<personne> .Maintenant, tous les changements dans la table de hachage sont reflétés dans cette collection, ce qui est le comportement par défaut .Mais ,j'ai besoin d'un fixe de collecte où tous les changements dans la carte ne sera pas traduit
Entendez-vous les modifications apportées à articles (objets) contenu de la table de hachage, par hasard?
Non..l'ordre d'insertion n'est pas ce que je recherche . disons que nous avons HashMap de <nom,personne> . la table de hachage.les valeurs de() serait de retour moi une collection<personne> .Maintenant, tous les changements dans la table de hachage sont reflétés dans cette collection, ce qui est le comportement par défaut .Mais ,j'ai besoin d'un fixe de collecte où tous les changements dans la carte ne sera pas traduit
Entendez-vous les modifications apportées à articles (objets) contenu de la table de hachage, par hasard?
OriginalL'auteur sanre6 | 2012-01-28
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas possible de le faire avec un seul appel d'API, vous devez utiliser profond de clonage. Les Clones ne sera pas modifié lorsque vous apportez des modifications à l'original. Ce sujet a été discuté auparavant, voir Comment cloner une liste de tableaux et également clone de son contenu? et Profonde cloner utilitaire recomendation.
Merci pour le modifier.
Np, et de la bonne réponse.
Cloner api a fait le travail pour moi . Merci pour les liens
OriginalL'auteur Bhesh Gurung
Google collections Immuables Carte peut vous aider.
voir Les Collections.unmodifiableMap aussi
Je crois que le Google collections Immuables de la Carte est ce que l'OP est à la recherche pour. @pst: Ma lecture de la documentation m'amène à croire que les objets contenus dans le document com.google.commun.collecter.ImmutableMap sont immuables.
Je ne crois pas que c'est de l'interprétation correcte. Il ne dit rien sur l'immutabilité de la
K
(la seule façon dont cela peut être réalisé en Java, avec un copier/cloner des objets de type K ajoutée). Il affirme qu'il est différent deunmodifiableMap
-- qui va lever une exception deput
-- mais toujours afficher de nouvelles clés viakeys
(par exemple) si le original (sauvegarde) de la Carte est modifiée; la documentation, il semble que cela est différence.Si l'origine de la sauvegarde de la carte est modifié (par exemple via les mettre), puis le ImmutableMap copie ne sera pas prendre en compte les modifications. (Si K représente une mutable type, vous avez déjà fait quelque chose de terriblement, terriblement mal.)
Notez que cette réponse liens de la "google-collections" du projet, qui a été abandonné plus de 2 ans. Voir guava-libraries.googlecode.com
OriginalL'auteur Balaswamy Vaddeman
Vous pouvez créer un inmodifiable Carte
Pour ne pas mentionner les changements dans l'original de la carte sont reflétées dans la copie.
Je crois que Justin est à droite. le
unmodifiableMap
méthode retourne une vue en lecture seule de la carte qui permettrait de prendre en compte les modifications de la base conteneur et sanre6 ne précise pas que les objets contenus doivent être imnmutable, seulement que la carte devrait être.OriginalL'auteur Justin Muller
La suite est toujours valide et décrit le problème observé (voir le peu sur ce genre de copie n'est effectuée). Je n'ai pas, cependant, de fournir une réponse comment pour effectuer une copie en profondeur.
Au lieu de cela, ma suggestion, est de concevoir des objets à immuable, ce qui permet d'éviter ce problème entièrement. Dans mon expérience, cela fonctionne vraiment bien pour le plus banal des objets (c'est-à-dire des biens qui ne sont pas des "conteneurs") et qui peut simplifier le code et le raisonnement à ce sujet.
De la Javadoc de
table de hachage.les valeurs de
:Il serait peut-être intéressant de créer une copie de celui-ci?
Qui, en essence, effectue une peu profond, la copie qui est "désormais". Cependant, être un copie superficielle, pas de clone/copie du contenu des objets est effectuée. (Voir βнɛƨн Ǥʋяʋиɢ réponse si copie en profondeur sémantique sont souhaitées: la question elle-même semble un peu vague sur le sujet).
Heureux de codage
Par "changements" voulez-vous dire par "les modifications apportées à objets de la collection"? (Par opposition aux "changements de la collection".) Si oui, voir les liens à faible profondeur/profondeur d'exemplaires, ce qui explique le comportement observé, et la réponse de βнɛƨн Ǥʋяʋиɢ.
ouais exactement les changements pour les objets contenus
Voir les liens. Et βнɛƨн Ǥʋяʋиɢ de répondre alors. 🙂
Personnellement, je ne faire l'objet d'eux-mêmes immuable par le contrat. La suppression de la mutabilité des objets peuvent ensemble de nier les questions de ce genre: pas de copie requis, parce que vous ne pouvez pas la modifier. Cela fonctionne très bien pour "de simples objets".
OriginalL'auteur
Créer une copie de la carte d'origine avec
HashMap.clone()
, puis de récupérer les valeurs colleation. Cela permettra de créer de nouvelles références vers les objets dans la carte originale, au moment de laclone()
appel; il est évident que des changements à l'intérieur les objets contenus eux-mêmes seront prises en compte dans le copié collection. Si vous voulez que ce comportement, votre seul moyen est de la copie papier de la carte des objets dans votre choix de la collection.OriginalL'auteur guido