Nous ne pouvons pas être sûrs de ce que pensaient réellement les concepteurs Java lors de la conception, String
mais nous ne pouvons conclure ces raisons que sur la base des avantages que nous retirons de l'immuabilité des chaînes, dont certains sont
1. Existence d'un pool de constantes de chaîne
Comme indiqué dans l'article Pourquoi la chaîne est stockée dans le pool de constantes de chaîne , chaque application crée trop d'objets chaîne et afin d'éviter que la JVM ne crée d'abord beaucoup d'objets chaîne, puis les récupère. La JVM stocke tous les objets chaîne dans une zone de mémoire distincte appelée pool de constantes String et réutilise les objets de ce pool mis en cache.
Chaque fois que nous créons un littéral de chaîne, la JVM voit d'abord si ce littéral est déjà présent dans le pool constant ou non et s'il y est, une nouvelle référence commencera à pointer vers le même objet dans SCP.
String a = "Naresh";
String b = "Naresh";
String c = "Naresh";
Dans exemple ci - dessus objet chaîne avec la valeur Naresh
sera créée en se SCP qu'une seule fois et toute référence a
, b
, c
pointera vers le même objet , mais si nous essayons de faire des changements dans a
par exemple a.replace("a", "")
.
Idéalement a
devrait avoir une valeur Nresh
mais b
, c
devrait rester inchangé car en tant qu'utilisateur final , nous faisons le changement a
seulement. Et nous savons a
, b
, c
tous pointent le même objet , donc si nous faisons un changement a
, d' autres devraient également refléter le changement.
Mais l'immuabilité des chaînes nous sauve de ce scénario et en raison de l'immuabilité de l'objet string, l'objet string Naresh
ne changera jamais. Ainsi, lorsque nous apportons une modification au a
lieu d'une modification dans l'objet chaîne, la Naresh
JVM crée un nouvel objet, assignez-le a
, puis modifiez cet objet.
Ainsi, le pool de chaînes n'est possible qu'en raison de l'immuabilité de String et si String n'aurait pas été immuable, la mise en cache des objets de chaîne et leur réutilisation n'aurait aucune possibilité car toute variable aurait changé la valeur et corrompu les autres.
Et c'est pourquoi il est géré par JVM très spécialement et dispose d'une zone mémoire spéciale.
2. Sécurité du fil
Un objet est appelé thread-safe lorsque plusieurs threads y opèrent, mais qu'aucun d'entre eux n'est capable de corrompre son état et que l'objet conserve le même état pour chaque thread à tout moment.
Comme nous, un objet immuable ne peut être modifié par personne après sa création, ce qui rend chaque objet immuable est thread-safe par défaut. Nous n'avons pas besoin de lui appliquer des mesures de sécurité des threads telles que la création de méthodes synchronisées.
Ainsi, en raison de sa nature immuable, l'objet string peut être partagé par plusieurs threads et même s'il est manipulé par de nombreux threads, il ne changera pas sa valeur.
3. Sécurité
Dans chaque application, nous devons transmettre plusieurs secrets, par exemple le nom d'utilisateur \ les mots de passe de l'utilisateur, les URL de connexion et, en général, toutes ces informations sont passées en tant qu'objet de chaîne.
Supposons maintenant que si String n'aurait pas été de nature immuable, cela entraînerait une menace sérieuse pour la sécurité de l'application car ces valeurs sont autorisées à être modifiées et si cela est autorisé, elles pourraient être modifiées en raison d'un code mal écrit ou de toute autre personne qui avoir accès à nos références variables.
4. Chargement de classe
Comme indiqué dans Création d'objets via la réflexion en Java avec exemple , nous pouvons utiliser la Class.forName("class_name")
méthode pour charger une classe en mémoire qui appelle à nouveau d'autres méthodes pour le faire. Et même JVM utilise ces méthodes pour charger des classes.
Mais si vous voyez clairement, toutes ces méthodes acceptent le nom de la classe en tant qu'objet chaîne, les chaînes sont donc utilisées dans le chargement de la classe java et l'immuabilité fournit la sécurité par laquelle la classe correcte est chargée ClassLoader
.
Supposons que String n'aurait pas été immuable et que nous essayions de charger java.lang.Object
ce qui est changé org.theft.OurObject
entre et maintenant tous nos objets ont un comportement que quelqu'un peut utiliser pour des choses indésirables.
5. Mise en cache du HashCode
Si nous allons effectuer des opérations liées au hachage sur un objet, nous devons remplacer la hashCode()
méthode et essayer de générer un hashcode précis en utilisant l'état de l'objet. Si l'état d'un objet change, cela signifie que son hashcode doit également changer.
Parce que String est immuable, la valeur d'un objet string ne sera jamais modifiée, ce qui signifie que son hashcode ne changera pas non plus, ce qui donne à la classe String l'occasion de mettre en cache son hashcode lors de la création de l'objet.
Oui, l'objet String met en cache son hashcode au moment de la création de l'objet, ce qui en fait le candidat idéal pour les opérations liées au hachage car le hashcode n'a pas besoin d'être calculé à nouveau, ce qui nous fait gagner du temps. C'est pourquoi String est principalement utilisé comme HashMap
clé.
En savoir plus sur les raisons pour lesquelles la chaîne est immuable et définitive en Java .