Du cadre Collections Vue d' ensemble :
Collections qui ne prend pas en charge les opérations de modification ( par exemple
add
,remove
etclear
) sont appelés non modifiable . Les collections qui ne sont pas non modifiables sont modifiables .Les collections qui garantissent en outre qu'aucune modification de l'
Collection
objet ne sera visible sont appelées immuables . Les collections qui ne sont pas immuables sont modifiables .
Je ne peux pas comprendre la distinction.
Quelle est la différence entre non modifiable et immuable ici?
la source
list
. Si quelque chose peut appeler plus tardlist.add(10)
alorscoll
reflétera ce changement, donc non, je ne l' appellerais pas immuable.Fondamentalement, la
unModifiable
collection est une vue, donc indirectement, elle pourrait encore être «modifiée» à partir d'une autre référence modifiable. Aussi comme il s'agit simplement d'une vue en lecture seule d'une autre collection, lorsque la collection source change, la collection non modifiable présentera toujours les dernières valeurs.Cependant,
immutable
Collection peut être traitée comme une copie en lecture seule d'une autre collection et ne peut pas être modifiée. Dans ce cas, lorsque la collection source change, la collection immuable ne reflète pas les modificationsVoici un cas de test pour visualiser cette différence.
Production
la source
modifiableList
etunModifiableList
a augmenté laimmutableList
taille n'a pas changénew ArrayList<String>(modifiableList)
immutableList ne peut pas être modifiénew ArrayList<String>(modifiableList)
cause denew
? Merci.Je pense que la principale différence est que le propriétaire d'une collection mutable peut vouloir fournir l'accès à la collection à un autre code, mais fournir cet accès via une interface qui ne permet pas à l'autre code de modifier la collection (tout en réservant cette capacité au code propriétaire). La collection n'est donc pas immuable, mais certains utilisateurs ne sont pas autorisés à modifier la collection.
Le didacticiel Java Collection Wrapper d' Oracle a ceci à dire (soulignement ajouté):
la source
Si nous parlons de JDK
Unmodifiable*
vs goyaveImmutable*
, la différence réside également dans les performances . Les collections immuables peuvent être à la fois plus rapides et plus efficaces en mémoire si elles ne sont pas des wrappers autour de collections régulières (les implémentations JDK sont des wrappers). Citant l'équipe de goyave :Le JDK fournit des méthodes Collections.unmodifiableXXX, mais à notre avis, elles peuvent être
<...>
la source
List.of(...)
fait effectivement une copie deux fois!Pour citer les didacticiels Java ™ :
(c'est moi qui souligne)
Cela résume vraiment les choses.
la source
Comme indiqué ci-dessus, non modifiable n'est pas comme immuable car une collection non modifiable peut être modifiée si, par exemple, une collection non modifiable a une collection déléguée sous-jacente qui est référencée par un autre objet et que cet objet la modifie.
En ce qui concerne immuable, ce n'est même pas bien défini. Cependant, cela signifie généralement que l'objet "ne changera pas", mais cela devrait être défini de manière récursive. Par exemple, je peux définir immuable sur des classes dont les variables d'instance sont toutes des primitives et dont les méthodes ne contiennent toutes aucun argument et renvoient des primitives. Les méthodes permettent ensuite récursivement aux variables d'instance d'être immuables et à toutes les méthodes de contenir des arguments qui sont immuables et qui renvoient des valeurs immuables. Les méthodes doivent être garanties de renvoyer la même valeur au fil du temps.
En supposant que nous pouvons le faire, il existe également le concept thread safe. Et vous pourriez être amené à croire qu'immuable (ou non modifiable dans le temps) implique également la sécurité des threads. Cependant, ce n'est pas le caset c'est le principal point que je fais ici qui n'a pas encore été noté dans d'autres réponses. Je peux construire un objet immuable qui renvoie toujours les mêmes résultats mais qui n'est pas thread-safe. Pour voir cela, supposons que je construise une collection immuable en conservant les ajouts et les suppressions au fil du temps. Désormais, la collection immuable renvoie ses éléments en examinant la collection interne (qui peut évoluer au fil du temps), puis (en interne) en ajoutant et en supprimant les éléments qui ont été ajoutés ou supprimés après la création de la collection. Clairement, bien que la collection renvoie toujours les mêmes éléments, elle n'est pas thread-safe simplement parce qu'elle ne changera jamais de valeur.
Nous pouvons maintenant définir les objets immuables comme des objets thread-safe et qui ne changeront jamais. Il existe des directives pour créer des classes immuables qui mènent généralement à de telles classes, cependant, gardez à l'esprit qu'il peut y avoir des façons de créer des classes immuables, qui nécessitent une attention à la sécurité des threads, par exemple, comme décrit dans l'exemple de collection "snapshot" ci-dessus.
la source
Les didacticiels Java ™ disent ce qui suit:
Je pense que c'est une assez bonne explication pour comprendre la différence.
la source