109 votes

Ce n'est immuable veux dire?

Si une chaîne est immuable, est-ce à dire que.... (supposons JavaScript)

var str = 'foo';

alert(str.substr(1)); // oo

alert(str); // foo

Signifie-t-il, lors de l'appel de méthodes sur une chaîne, il sera de retour la chaîne modifiée, mais cela ne va pas changer la chaîne initiale?

Si la chaîne a été mutable, c'est dire le 2e alert() reviendrait oo ?

106voto

Kevin Points 57797

Cela signifie qu'une fois que vous créez une instance de l'objet, vous ne pouvez pas modifier ses propriétés. Dans votre premier exemple, vous ne sont pas changer foo. Vous êtes en train de créer une nouvelle chaîne. C'est pourquoi, dans votre second message d'alerte, il va montrer "foo" au lieu de oo.

Signifie-t-il, lors de l'appel de méthodes sur une chaîne de caractères, il sera de retour de la modification de la la chaîne, mais il ne changera pas le chaîne initiale?

Oui. Rien ne peut changer la chaîne une fois qu'il est créé. Maintenant, cela ne signifie pas que vous ne pouvez pas affecter un nouvel objet string à l' str variable. Vous ne pouvez pas modifier l'objet str références.

Si la chaîne a été mutable, qui ne moyenne de la 2ème alert() serait de retour oo ainsi?

Techniquement, non, parce que la sous-chaîne de la méthode renvoie une nouvelle chaîne de caractères. La réalisation d'un objet mutable, ne pas changer de méthode. Rendant mutable signifie que, techniquement, vous pouvez faire en sorte que les sous-chaîne serait de changer de chaîne au lieu d'en créer un nouveau.

102voto

deceze Points 200115

Sur un niveau inférieur, l'immuabilité signifie que la mémoire de la chaîne est stockée dans ne sera pas modifié. Une fois que vous créez une chaîne de caractères "foo", la mémoire est allouée pour stocker la valeur "foo". Ce mémoire ne sera pas modifiée. Si vous modifiez la chaîne avec, disons, substr(1), une nouvelle chaîne est créé et une autre partie de la mémoire est allouée qui permet de stocker "oo". Maintenant, vous avez deux chaînes de caractères en mémoire, "foo" et "oo". Même si vous n'allez pas utiliser "foo" plus, il va rester jusqu'à ce que c'est le garbage collector.

Une raison pour laquelle les opérations de la chaîne sont relativement coûteux.

14voto

SoftwareGeek Points 2899

Immuable signifie que ce qui ne peut être changé ou modifié.

Ainsi, lorsque vous affectez une valeur à une chaîne, cette valeur est créée à partir de zéro plutôt que d'être remplacé. Donc, chaque fois qu'une nouvelle valeur est affectée à la même chaîne, une copie est créée. Donc, en réalité, vous n'êtes jamais à la modification de la valeur d'origine.

9voto

Brian S Points 2244

Je ne suis pas certain à propos de JavaScript, mais en Java, les chaînes de prendre une étape supplémentaire pour l'immuabilité, avec la "Constante de Chaîne de la Piscine". Les chaînes peuvent être construits avec des littéraux de chaîne ("foo") ou avec un String le constructeur de la classe. Les chaînes construites avec des littéraux de chaîne sont une partie de la Chaîne Constante de la Piscine, et de la même chaîne de caractères littérale sera toujours la même adresse mémoire de la piscine.

Exemple:

    String lit1 = "foo";
    String lit2 = "foo";
    String cons = new String("foo");

    System.out.println(lit1 == lit2);      // true
    System.out.println(lit1 == cons);      // false

    System.out.println(lit1.equals(cons)); // true

Ci-dessus, les deux lit1 et lit2 sont construits à l'aide de la même chaîne de caractères littérale, de sorte qu'ils pointent vers le même adresse en mémoire; lit1 == lit2 résultats en true, parce qu'ils sont exactement le même objet.

Toutefois, cons est construit en utilisant le constructeur de la classe. Bien que le paramètre est égal à la constante de chaîne, le constructeur alloue de la mémoire pour cons, signifiant cons n'est pas le même objet que l' lit1 et lit2, malgré contenant les mêmes données.

Bien sûr, depuis les trois chaînes contiennent toutes le même caractère de données, à l'aide de l' equals méthode renvoie true.

(Les deux types de chaîne de construction sont immuables, bien sûr)

3voto

Nataraj Points 21

Immuable: la valeur ne peut pas être changé. Une fois créé un objet de type string ne peut pas être modifié comme immuable. Si vous demandez une sous-chaîne d'une chaîne d'une nouvelle Chaîne avec la partie demandée est créé.

À l'aide de StringBuffer lors de la manipulation de Chaînes de caractères au lieu de cela rend l'opération plus efficace que StringBuffer magasins de la chaîne en un tableau de caractères avec des variables pour stocker la capacité du tableau de caractères et la longueur du tableau(Chaîne de caractères dans un char de la matrice de la forme)

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