Unmodifiablmap (Java Collections) vs Immutablmap (Google) [dupliquer]

cette question a déjà une réponse ici:

Contexte

je dois retourner une référence à une carte que j'utilise pour un cache de données, et je voudrais m'assurer que personne ne peut modifier leur référence.

Question

j'ai vu beaucoup de références à unmap et immutable immutable en ligne, mais je ne vois rien les comparer. Je pense qu'il y a une bonne raison pour que Google/Guava aient créé leur propre version - quelqu'un peut-il me dire ce que c'est?

70
demandé sur John Humphreys - w00te 2014-03-25 17:49:06

4 réponses

une carte non modifiable peut encore changer. Il s'agit seulement d'une view sur une carte modifiable, et les changements dans la carte de fond seront visibles à travers la carte non modifiable. La carte non modifiable empêche seulement les modifications pour ceux qui ont seulement la référence à la vue non modifiable:

Map<String, String> realMap = new HashMap<String, String>();
realMap.put("A", "B");

Map<String, String> unmodifiableMap = Collections.unmodifiableMap(realMap);

// This is not possible: It would throw an 
// UnsupportedOperationException
//unmodifiableMap.put("C", "D");

// This is still possible:
realMap.put("E", "F");

// The change in the "realMap" is now also visible
// in the "unmodifiableMap". So the unmodifiableMap
// has changed after it has been created.
unmodifiableMap.get("E"); // Will return "F". 

par opposition à cela, L'immutable carte de goyave est vraiment immuable : c'est une véritable copie d'un donné carte, et personne ne peut modifier cette ImmutableMap en aucune façon.

mise à Jour :

comme indiqué dans un commentaire , une carte immuable peut également être créée avec L'API standard en utilisant

Map<String, String> immutableMap = 
    Collections.unmodifiableMap(new LinkedHashMap<String, String>(realMap)); 

cela créera une vue inamovible sur une copie fidèle de la carte donnée, et donc imite bien les caractéristiques du ImmutableMap sans avoir à ajouter la dépendance à la goyave.

137
répondu Marco13 2017-05-23 12:10:11

Have a look at Immutablmap JavaDoc: doc

il y a des informations à ce sujet là:

Contrairement Aux Collections.unmodifiableMap (java.util.Map), qui est une vue d'une carte séparée qui peut encore changer, une instance D'Immutablmap contient ses propres données et ne changera jamais. Immutablmap est pratique pour les cartes publiques statiques finales ("cartes constantes") et vous permet également de faire facilement une "copie défensive" de une carte fournie à votre classe de l'appelant.

7
répondu Jakub H 2014-03-25 13:52:47

Documentation Sur La Goyave

le JDK fournit Collections.unmodifiableXXX méthodes, mais à notre avis, ceux-ci peuvent être lourds et verbeux; désagréable à utiliser partout vous voulez faire des copies défensives dangereux: les collections retournées ne sont vraiment immuable si personne ne détient une référence à la collection originale inefficace: les structures de données ont encore tous les frais généraux de collections mutables, y compris la modification concurrente vérifications, espace supplémentaire dans les tables de hachage, etc.

2
répondu Eric Stein 2016-05-25 23:15:48

Immutablmap n'accepte pas les valeurs null alors que Collections.unmodifiableMap() n'accepte pas. En outre, il ne changera jamais après la construction, tandis que UnmodifiableMap mai. Du JavaDoc:

une carte immuable, basée sur le hachage, avec un ordre d'itération fiable spécifié par l'utilisateur. Ne permet pas les clés nulles ou les valeurs.

Contrairement Aux Collections.unmodifiableMap (java.util.Map), qui est une vue d'une autre carte qui peut encore changer, une instance de Immutablmap contient ses propres données et ne changera jamais. Immutablmap est pratique pour les cartes publiques statiques finales ("cartes constantes") et vous permet également de faire facilement une" copie défensive " d'une carte fournie à votre classe par un appelant.

2
répondu Harmlezz 2016-07-25 10:26:24