222 votes

String est immuable. Quel est exactement le sens?

J'ai écrit le code suivant sur Immutable Strings.

 public class ImmutableStrings {

    public static void main(String[] args) {
        testmethod();
    }

    private static void testmethod() {
    String a="a";
    System.out.println("a 1-->"+a);
    a = "ty";
    System.out.println("a 2-->"+a);
    }
}
 

Sortie:

 a 1-->a  
a 2-->ty
 

Ici, la valeur de la variable a a été modifiée (alors que beaucoup disent que le contenu des objets immuables ne peut pas être modifié). Mais que veut-on dire exactement en disant que String est immuable ? Pourriez-vous s'il vous plaît clarifier ce sujet pour moi?

463voto

roger_that Points 791

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 :

  1. La première ligne est assez simple, créer une nouvelle Chaîne "java" et de se référer s1 .
  2. 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!

175voto

Eng.Fouad Points 44085

String est immuable signifie que vous ne pouvez pas modifier l'objet lui-même, mais vous pouvez changer la référence à l'objet. Lorsque vous avez appelé a = "ty", vous êtes en train de modifier la référence de l' a d'un nouvel objet créé par la Chaîne de caractères littérale "ty". Modification d'un objet moyens d'utiliser ses méthodes pour modifier l'un de ses champs (ou les champs sont publiques et non définitive, de sorte qu'ils peuvent être mis à jour depuis l'extérieur sans y accéder par l'intermédiaire des méthodes), par exemple:

Foo x = new Foo("the field");
x.setField("a new field");
System.out.println(x.getField()); // prints "a new field"

Alors que dans une immuable (de la classe déclarée final, pour empêcher toute modification via l'héritage)(ses méthodes ne peuvent pas modifier ses champs, et les champs sont toujours privés et recommandé de finale), par exemple une Chaîne de caractères, vous ne pouvez pas changer de Chaîne, mais vous pouvez renvoyer une nouvelle Chaîne, je.e:

String s = "some text";
s.substring(0,4);
System.out.println(s); // still printing "some text"
String a = s.substring(0,4);
System.out.println(a); // prints "some"

19voto

Greg Hewgill Points 356191

Vous changez ce à quoi a réfère . Essaye ça:

 String a="a";
System.out.println("a 1-->"+a);
String b=a;
a="ty";
System.out.println("a 2-->"+a);
System.out.println("b  -->"+b);
 

Vous verrez que l' objet auquel a et ensuite b réfèrent n'a pas changé.

Si vous souhaitez empêcher votre code de changer à quel objet a réfère, essayez:

 final String a="a";
 

4voto

Rakesh Patel Points 258

immuable signifie que vous ne pouvez pas modifier la valeur de la même référence. Chaque heure nécessaire pour créer une nouvelle référence signifie un nouvel emplacement mémoire. ex:

 String str="abc";
str="bcd";
 

ici, dans le code ci-dessus, il y a 2 blocs dans la mémoire pour stocker la valeur. Le premier pour la valeur "abc" et le second pour "bcd". La deuxième valeur n'est pas remplacée par la première.

c'est ce qu'on appelle l'immuable.

3voto

Jonathan Newmuis Points 10958

Dans votre exemple, la variable a n'est qu'une référence à une instance d'un objet chaîne. Lorsque vous dites a = "ty" , vous ne modifiez pas réellement l'objet chaîne, mais vous pointez plutôt la référence sur une instance entièrement différente de la classe string.

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