Duplicata possible:
Pourquoi les chaînes ne peuvent-elles pas être mutables dans Java et .NET?
Pourquoi la chaîne .NET est immuable?
Plusieurs langages ont choisi pour cela, comme C #, Java et Python. S'il vise à économiser de la mémoire ou à gagner en efficacité pour des opérations comme comparer, quel effet cela a-t-il sur la concaténation et les autres opérations de modification?
Les types immuables sont généralement une bonne chose:
En conséquence, c'est un choix de conception de langage assez raisonnable pour rendre les chaînes immuables.
Certains langages (en particulier les langages fonctionnels comme Haskell et Clojure) vont encore plus loin et rendent à peu près tout immuable. Cette vidéo éclairante vaut vraiment le détour si vous êtes intéressé par les avantages de l'immuabilité.
Il existe quelques inconvénients mineurs pour les types immuables:
Dans l'ensemble cependant, les avantages de l'immuabilité l'emportent largement sur les inconvénients mineurs. Même si vous n'êtes intéressé que par les performances, les avantages de la concurrence et le coût peu élevé de la copie rendront généralement les chaînes immuables beaucoup plus performantes que les chaînes mutables avec verrouillage et copie défensive.
Il est principalement destiné à éviter les erreurs de programmation. Par exemple, les chaînes sont fréquemment utilisées comme clés dans les tables de hachage. S'ils pouvaient changer, la table de hachage serait corrompue. Et ce n'est qu'un exemple où la modification d'un élément de données pendant que vous l'utilisez pose des problèmes. La sécurité en est une autre: si vous vérifiez si un utilisateur est autorisé à accéder à un fichier à un chemin donné avant d'exécuter l'opération qu'il a demandée, la chaîne contenant le chemin ne doit pas être mutable ...
Cela devient encore plus important lorsque vous faites du multithreading. Les données immuables peuvent être transmises en toute sécurité entre les threads tandis que les données mutables provoquent des maux de tête sans fin.
Fondamentalement, les données immuables facilitent la réflexion sur le code qui y fonctionne. C'est pourquoi les langages purement fonctionnels essaient de garder tout immuable.
In Java non seulement String mais toutes les classes Wrapper primitives (Integer, Double, Character 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 lesquels tous les schémas de programmation fonctionnent. S'ils changent, les choses pourraient se déchaîner. Pour être plus précis, je vais utiliser un exemple: disons que vous avez ouvert une connexion socket à un hôte distant. Le nom d'hôte serait une chaîne et le port serait un entier Que faire si ces valeurs sont modifiées une fois la connexion établie.
En ce qui concerne les performances, Java alloue de la mémoire à ces classes à partir d'une section de mémoire distincte appelée Literal Pool, et non à partir de la pile ou du tas. Le Literal Pool est indexé et si vous utilisez une chaîne " Chaîne "deux fois, ils pointent vers le même objet du pool littéral.
Le fait d'avoir des chaînes aussi immuables permet également de faciliter les nouvelles références de chaînes, car les mêmes chaînes/similaires seront facilement disponibles à partir du pool des chaînes précédemment créées. Réduisant ainsi le coût de la création de nouveaux objets.