Immutable String en Java

Récemment lors d’un entretien pour mon futur stage de cinquième année, j’ai passé une épreuve technique en Java. Une question portait sur un objet String modifié dans une méthode et affiché ensuite. Sans certitude, j’ai répondu que les String n’étaient pas des objets modifiables de cette manière dans une méthode. Ma réponse était la bonne, mais, curieux, j’ai voulu découvrir pourquoi. Les String en Java sont immutables.javaimmutableString

Exemple

Considérons le code suivant:

Dans cet exemple, on voit que la valeur n’est pas modifiée. En effet, dans la méthode main une variable pointant sur la valeur « Hello » est créée. Cette variable est passée en paramètre de la méthode addToto. Dans cette dernière, on utilise la valeur de notre paramètre pour créer une nouvelle valeur « Hello Toto », mais la variable str précédente ne pointe pas sur la nouvelle valeur mais toujours sur l’ancienne.

main:
str -> « Hello »

addToto:
str -> « Hello »
+
nouvelle allocation mémoire : « Hello Toto »

Aucune variable ne pointe sur ce nouvel espace mémoire, il est donc perdu à la sortie de la méthode. Si nous avions voulu conserver la nouvelle valeur, il aurait fallu la retourner et l’assigner à notre variable str.

Pourquoi les String sont immutables?

Performance et Design

Tout d’abord les String sont des objets particuliers qui sont stockés dans une zone particulière de la mémoire. Les String y sont stockées sous forme littérale: « Toto ». Cette « String Pool » permet de n’avoir qu’un seul exemplaire de chaque littérale en mémoire. A chaque création d’une valeur, la JVM va vérifier qu’elle n’existe pas dans la pool, et si elle est présente, retourner le pointeur existant. Imaginons que les String ne soient pas immutables : si deux variables sont égales à « Toto » (String s1 = « Toto »; String s2 = « Toto »;), elles pointent vers la même zone mémoire et la modification de l’une entraîne la modification de l’autre.

Sécurité

Les String sont immutables pour des raisons de sécurité. En effet, les objets immutables sont naturellement Thread-Safe, aucune synchronisation n’est nécessaire puisque les valeurs sont fixes. Pour illustrer cette sécurité accrue, on peut prendre l’exemple d’une connexion à une base de données qui se base majoritairement sur une String. Si l’accès à la connexion est protégé par un test et que la connexion est effectuée juste après celui-ci, il ne faut pas que la chaîne soit modifiée entre-temps.

Autres avantages annexes

D’autres arguments plus mineures peuvent être invoqués.
Chaque String possède un hashCode par exemple utilisée dans les HashMap. La modification d’une String immutable demanderait de recalculer la valeur de ce hashCode. Par ailleurs, l’utilisation des String dans les Set qui n’autorisent que des clés uniques serait impossible avec des strings mutables car on provoquerait des erreurs trop complexes. Des objets immutables peuvent également partager des valeurs internes communes ce qui permet un gain en mémoire.

Ce choix concernant les String en Java est donc un choix mêlant design, performance et efficacité pour la JVM et pour les développeurs qui n’ont pas à gérer les références d’objets très utilisés.

spacer

Laisser un commentaire