Avant d'aller plus loin avec l'agitation de l' Immutability
, il suffit de prendre un coup d'oeil dans la classe String et ses fonctionnalités un peu avant de venir à une conclusion au sujet de son immuabilité.
C'est de cette manière Chaîne fonctionne.
`String str = "knowledge"`;
Cette comme d'habitude, crée une chaîne nommée "connaissances" et lui attribuer une référence "str". Assez Simple? Permet d'effectuer certaines fonctions:
String s = str ; // assigns a new reference to the same string "knowledge"
Permet de voir comment ci-dessous la déclaration de travaux:
str = str.concat(" base");
Cela, ajoute une chaîne " de base" à la str . Mais attendez, comment est-ce possible, puisque la Chaîne objets sont-ils immuables ? Bien à votre grande surprise, il est.
Lorsque la déclaration ci-dessus est exécuté, VM prend la valeur de la Chaîne de caractères str, c'est à dire "knowledge"
et append " base"
, en nous donnant la valeur "knowledge base"
. Maintenant, depuis que les Chaînes sont immuables, VM ne peut pas affecter cette valeur à str
de sorte qu'il crée un nouvel Objet String, lui donne une valeur "knowledge base"
et il donne une référence str
.
Point Important à noter ici est que, si l'objet String est immuable, sa variable de référence n'est pas. C'est pourquoi dans l'exemple ci-dessus, il a été fait pour désigner nouvellement formé Objet de type String.
À ce point dans l'exemple ci-dessus, nous avons deux Objets String, le premier que nous avons créé avec la valeur "knowledge"
, pointée par s
et le second "knowledge base"
pointée par str
. Mais, techniquement, nous avons trois Objet de type String, le troisième étant le littéral "base"
dans la concaténation de la déclaration.
Faits importants à propos de la Chaîne et de l'utilisation de la Mémoire
Que faire si nous n'avions pas une autre référence s
de "knowledge"
, nous aurions perdu cette Chaîne. Cependant, il devrait encore exister, mais serait considéré comme perdu en raison de l'absence de référence.
Regardez un exemple ci-dessous
String s1 = "java";
s1.concat(" rules");
System.out.println("s1 refers to "+s1); // Yes, s1 still refers to "java"
Ce qui se passe :
- La première ligne est assez simple, créer une nouvelle Chaîne "java" et de se référer s1 .
- Ensuite, la machine virtuelle crée une autre nouvelle Chaîne "java règles" mais rien
se réfère à elle. Donc, la deuxième Chaîne est immédiatement perdu. Nous ne pouvons pas toucher à
c'.
La variable de référence s1 fait toujours référence à la Chaîne d'origine "java".
Presque chaque méthode, appliquée à un objet de type String afin de le modifier, crée un nouvel objet de type String. Alors, d'où viennent ces objets String aller ? Well these exists in memory and one of the key goal of any programming language is to make efficient use of memory.
Comme les applications se développe, its very common for String literals to occupy large area of memory which can even cause redundancy
. Donc, afin de faire la java la plus efficace, la JVM met de côté une zone spéciale de la mémoire appelée "constante de Chaîne de la piscine".
Lorsque le compilateur voit un littéral de Chaîne, il recherche la Chaîne dans la piscine. Si une correspondance est trouvée, la référence à la nouvelle littérale est dirigé vers la Chaîne existante et pas de nouvelles de la Chaîne de création de l'objet. La Chaîne existante a tout simplement encore une référence. Voici le point de faire l'objet de Corde comme immuable.
Dans la Chaîne de caractères constante de la piscine, un objet String est susceptible d'avoir un ou plusieurs références. If several references point to same String without even knowing it, it would be bad if one of the references modifies a String value. That's why String objects are immutable.
Eh bien maintenant, on peut dire qu' what if someone overrides the functionality of String class?
C'est encore la raison pour laquelle la classe String est marquée Final personne ne pouvait remplacer le comportement de la Chaîne de méthodes.
Cheers!