Comment obtenir une collection immuable de java HashMap?

Je dois obtenir une collection de java HashMap sans que les modifications apscopes à la carte ne soient reflétées ultérieurement dans la collection. Je voulais utiliser Collection.toArray () pour y parvenir, mais cela ne fonctionne pas. L’object résultant [] est également en train de changer (les javadocs disent que le tableau retourné sera “sûr” car aucune référence à ce tableau n’est conservée par cette collection). Un moyen simple d’y parvenir?

Ce n’est pas possible de faire cela avec un seul appel d’API, vous devez utiliser le clonage en profondeur. Les clones ne seront pas modifiés lorsque vous apportez des modifications à l’original. Ce sujet a déjà été abordé sur SO, voir Comment cloner ArrayList et également cloner son contenu? et recommandation de l’utilitaire Deep Clone .

Les collections immuables de Google peuvent vous aider.

voir Collections.unmodifiableMap également

Vous pouvez créer une carte non modifiable

Ce qui suit est toujours valable et décrit le problème observé (voir le bit sur le type de copie effectuée). Cependant, je ne donne aucune réponse sur la manière de réaliser une copie en profondeur.

Au lieu de cela, ma suggestion est de concevoir les objects comme étant immuables , ce qui évite totalement ce problème. D’après mon expérience, cela fonctionne très bien pour la plupart des objects sortingviaux (c’est-à-dire des objects qui ne sont pas des “conteneurs”) et permet de simplifier le code et le raisonnement à ce sujet.


De la Javadoc pour HashMap.values :

Renvoie une vue Collection des valeurs contenues dans cette carte. La collection étant sauvegardée par la carte , les modifications apscopes à la carte sont reflétées dans la collection , et inversement …

Peut-être serait-il utile d’en créer une copie?

 HashMap map = ....; List values = new ArrayList(map.values()); 

Cela, en substance, effectue une copie superficielle qui est “maintenant séparée”. Cependant, étant une copie superficielle , aucun clone / copie des objects contenus n’est effectué . (Voir la réponse de βнɛƨн Ǥʋяʋиɢ si l’on souhaite une sémantique en copie profonde : la question elle-même semble un peu vague à ce sujet.)

Code heureux

Créez une copie superficielle de la carte originale avec HashMap.clone() , puis récupérez la collection de valeurs à partir de celle-ci. Cela créera de nouvelles références aux objects de la carte d’origine au moment de l’appel de clone() ; évidemment, les modifications à l’intérieur des objects contenus elles-mêmes seront toujours répercutées dans la collection copiée. Si vous voulez ce comportement, votre seul moyen est de copier sur papier les objects de la carte dans votre collection souhaitée.