60 votes

Pourquoi les chaînes sont-elles immuables dans de nombreux langages de programmation?

Double Possible:
Pourquoi ne peut-chaînes mutable en Java et .NET?
Pourquoi .NET String est immuable?

Plusieurs langues ont choisi pour cette, tels que C#, Java et Python. S'il est prévu d'économiser de la mémoire ou un gain d'efficacité pour des opérations comme les comparer, quel effet a-t-elle sur la concaténation et la modification d'autres opérations?

75voto

mikera Points 63056

Immuable types de sont une bonne chose en général:

  • Ils fonctionnent mieux pour la concurrence (vous n'avez pas besoin de verrouiller quelque chose qui ne peut pas changer!)
  • Ils réduisent les erreurs: mutable objets sont susceptibles d'être modifiés lorsque vous ne l'attendez pas ce qui peut introduire toutes sortes de bugs étranges ("action à distance")
  • Ils peuvent être en toute sécurité partagée (c'est à dire plusieurs références pour le même objet), ce qui peut réduire la consommation de mémoire et d'améliorer l'utilisation du cache.
  • Le partage fait aussi de la copie d'un très bon marché O(1) une opération lorsqu'il serait en O(n) si vous avez à prendre une position défensive copie d'un objet mutable. C'est une grosse affaire parce que la copie est d'une incroyable opération courante (par exemple, lorsque vous voulez passer des paramètres....)

En conséquence, il est assez raisonnable de conception de langage de choix pour faire des cordes immuable.

Certaines langues (en particulier les langages fonctionnels comme Haskell et Clojure) vont encore plus loin et de faire à peu près tout immuable. Cette éclairant la vidéo est très bien vaut le coup d'oeil si vous êtes intéressés par les avantages de l'immuabilité.

Il ya un couple de mineurs inconvénients pour immuable types:

  • Les opérations qui créent un changement de la chaîne de concaténation sont plus chers parce que vous avez besoin pour construire de nouveaux objets. Généralement, le coût est de O(n+m) pour la concaténation de deux Cordes immuables, mais il peut aller aussi bas que O(log (m+n)) si vous utilisez une arborescence de base de données chaîne de la structure comme une Corde. De Plus, vous pouvez toujours utiliser des outils spéciaux comme Java StringBuilder si vous avez vraiment besoin de concaténer des Chaînes de caractères de manière efficace.
  • Un petit changement sur une grande chaîne peut entraîner la nécessité de construire une toute nouvelle copie de la Chaîne de grande taille, ce qui augmente évidemment la consommation de mémoire. Notez toutefois que ce n'est généralement pas un gros problème dans le garbage collector de langues depuis l'ancienne copie obtiendrez d'ordures collectées assez rapidement si vous ne gardez pas une référence.

Mais dans l'ensemble, les avantages de l'immuabilité emportent largement sur les inconvénients mineurs. Même si vous êtes seulement intéressé par la performance, la simultanéité des avantages et bon marché de la reproduction en général, les cordes immuables beaucoup plus performants que mutable ceux avec dispositif de verrouillage et de défense de la copie.

17voto

Michael Borgwardt Points 181658

Il est principalement destiné à prévenir les erreurs de programmation. Par exemple, les Chaînes sont fréquemment utilisés comme clés dans les tables de hashage. S'ils pouvaient changer, la table de hachage qui allait devenir corrompu. Et c'est juste un exemple où le fait d'avoir un morceau de modification des données pendant que vous l'utilisez les causes des problèmes. La sécurité est un autre: si vous vérifier si un utilisateur est autorisé à accéder à un fichier à un chemin donné avant d'exécuter l'opération demandée, la chaîne de caractères contenant le chemin d'accès vaut mieux ne pas être mutable...

Il devient encore plus important lorsque vous êtes en train de faire du multithreading. Les données immuables peut être passé en toute sécurité autour de entre les threads alors que les données mutable provoque des maux de tête sans fin.

Fondamentalement, les données immuables rend le code qui fonctionne sur il est plus facile de raisonner sur. C'est pourquoi purement fonctionnelle langues essayez de garder tout immuable.

3voto

Ameya Points 319

En Java, pas seulement la Corde, mais tous primitif classes (Integer, Double, Caractère, etc) sont immuables. Je ne suis pas sûr de la raison exacte, mais je pense que ce sont les types de données de base sur laquelle tous les modèles de programmation de travaux. Si elles changent, les choses pourraient aller sauvages. Pour être plus précis, je vais utiliser un exemple: Disons que vous avez ouvert une socket de connexion à un hôte distant. Le nom de l'hôte serait une Chaîne et le port serait Entier. Si ces valeurs sont modifiées après l'établissement de la connexion.

Comme la mesure de la performance est concerné, Java alloue de la mémoire pour ces classes à partir d'un mémoire distinct section Littérale de la Piscine, et non pas à partir de la pile ou le Tas. Le sens Littéral de la Piscine est indexé et si vous utilisez une chaîne "String" deux fois, ils pointent vers le même objet à partir Littérale de la piscine.

0voto

saurabytes Points 1

Avoir des chaînes immuables facilite également les nouvelles références de chaînes, car les chaînes identiques / similaires seront facilement disponibles dans le pool des chaînes créées précédemment. Réduisant ainsi le coût de la création d'un nouvel objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X