Quelle est la différence entre la chaîne mutable et immuable en java?

à ma connaissance,

une chaîne mutable peut être changée, et immuable chaîne ne peut pas être changé.

ici, je veux changer la valeur D'une chaîne comme celle-ci,

String str="Good";
str=str+" Morning";

et d'autres,

StringBuffer str= new StringBuffer("Good");
str.append(" Morning");

dans les deux cas, j'essaie de modifier la valeur de str . Est-ce que quelqu'un peut me dire, quelle est la différence dans les deux cas et me donner une image claire de mutable et immuable objet.

38
demandé sur Ani Menon 2014-08-05 16:15:23

12 réponses

Cas 1:

String str = "Good";
str = str + " Morning";

dans le code ci-dessus vous créez 3 String objets.

  1. "Bon", il va dans le Chaîne de Piscine .
  2. "le Matin", il va dans le Chaîne de Piscine .
  3. "Bon Matin" créé par la concaténation de "Bon" et "le Matin". Ce type va sur le tas .

Note: les cordes sont toujours immuable . Il n'y a pas, comme une chaîne mutable . str est juste une référence qui éventuellement pointe à"Bonjour". Vous êtes en fait, pas travailler sur 1 objet. vous avez 3 distinct String objets.


Cas 2:

StringBuffer str = new StringBuffer("Good"); 
str.append(" Morning");

StringBuffer contient un tableau de caractères. C'est et non comme un String . Le code ci-dessus ajoute des caractères au tableau existant. En effet, StringBuffer est mutable, sa représentation String ne l'est pas.

69
répondu TheLostMind 2016-03-03 20:00:15

Quelle est la différence entre la chaîne mutable et immuable en java

immuable existent, mutable ne le font pas.

11
répondu Philipp Sander 2014-08-05 12:17:50

en Java, toutes les chaînes sont immuables. Quand vous essayez de modifier un String , ce que vous faites vraiment est de créer un nouveau. Toutefois, lorsque vous utilisez un StringBuilder , vous êtes réellement en modifier le contenu, au lieu d'en créer un nouveau.

7
répondu Balduz 2014-08-05 12:16:57

Java String s sont immuables.

dans votre premier exemple, vous changez la référence en String , lui assignant ainsi la valeur de deux autres Strings combinés: str + " Morning" .

au contraire, un StringBuilder ou StringBuffer peut être modifié par ses méthodes.

5
répondu Mena 2014-08-05 12:17:14

quand vous dites str , vous devez faire attention à ce que vous voulez dire:

  • voulez-vous dire la "variable str ?

  • ou voulez-vous dire objet référencé par str ?

dans votre exemple StringBuffer vous ne modifiez pas la valeur de str , et dans votre String exemple vous ne modifiez pas l'état de l'objet String .

la façon la plus poignante d'éprouver la différence serait quelque chose comme ceci:

static void change(String in) { 
  in = in + " changed";
}

static void change(StringBuffer in) {
  in.append(" changed");
}

public static void main(String[] args) {
   StringBuffer sb = new StringBuffer("value");
   String str = "value";
   change(sb);
   change(str);
   System.out.println("StringBuffer: "+sb);
   System.out.println("String: "+str);
}
3
répondu William F. Jameson 2014-08-05 12:22:54

la chaîne en Java est immuable . Cependant que signifie être mutable dans un contexte de programmation est la première question. Envisager la classe suivante,

public class Dimension {
    private int height;

    private int width;

    public Dimenstion() {
    }

    public void setSize(int height, int width) {
        this.height = height;
        this.width = width;
    }

    public getHeight() {
        return height;
    }

    public getWidth() {
        return width;
    }
}

maintenant après avoir créé l'instance de Dimension nous pouvons toujours mettre à jour ses attributs. Notez que si l'une de l'attribut, dans l'autre sens, peuvent être mis à jour pour l'instance de la classe puis on dit que c'est mutable. Nous pouvons toujours le faire à la suite,

Dimension d = new Dimension();
d.setSize(10, 20);// Dimension changed
d.setSize(10, 200);// Dimension changed
d.setSize(100, 200);// Dimension changed

voyons de différentes façons nous pouvons créer une chaîne de caractères en Java.

String str1 = "Hey!";
String str2 = "Jack";
String str3 = new String("Hey Jack!");
String str4 = new String(new char[] {'H', 'e', 'y', '!'});
String str5 = str1 + str2;
str1 = "Hi !";
// ...

,

  1. str1 et str2 sont des littéraux de Chaîne qui va être créé en constante Chaîne de la piscine
  2. str3 , str4 et str5 sont des objets String qui sont placés dans la mémoire tas
  3. str1 = "Hi!"; crée "Hi!" dans le pool de cordes constant et c'est une référence totalement différente de "Hey!" qui str1 se référant plus tôt.

ici nous créons l'objet String literal ou String. Les deux sont différents, je vous suggérerais de lire le post suivant pour en comprendre plus à ce sujet.

dans n'importe quelle déclaration de chaîne, une chose est commune, qu'il ne modifie pas mais il obtient créé ou transférés à d'autres.

String str = "Good"; // Create the String literal in String pool
str = str + " Morning"; // Create String with concatenation of str + "Morning"
|_____________________|
       |- Step 1 : Concatenate "Good"  and " Morning" with StringBuilder
       |- Step 2 : assign reference of created "Good Morning" String Object to str

comment la chaîne est-elle devenue immuable ?

c'est comportement non changeant, signifie, la valeur une fois attribuée ne peut pas être mise à jour d'une autre manière. La classe String contient en interne des données dans le tableau de caractères. De plus, class est créé pour être immuable. Jetez un oeil à cette stratégie pour définir classe immuable.

"1519360920 un" Déplacement de la la référence ne signifie pas que vous avez changé sa valeur. Il serait mutable si vous pouvez mettre à jour le tableau de caractères qui se trouve derrière la scène dans la classe String. Mais en réalité, ce tableau sera initialisé une fois et tout au long du programme, il reste le même.

pourquoi StringBuffer est mutable ?

comme vous l'avez déjà deviné, la classe StringBuffer est elle-même mutable comme vous pouvez la mettre à jour est inscrire directement. Similaire à la chaîne de caractères, il contient également de la valeur dans le tableau de caractères et vous pouvez manipuler ce tableau par différentes méthodes i.e. Ajouter, Supprimer, insérer, etc. qui modifie directement le tableau des valeurs des caractères.

3
répondu coder-croc 2017-05-23 12:03:03

ses très facilement expliqué dans ce lien avec setter et getter classe est mutable tandis que la catégorie avec seulement getter est immuable. Voici les détails. http://latest-tutorial.com/2014/11/14/difference-mutable-immutable-objects-java/

1
répondu Zeeshan Akhter 2015-06-09 10:26:42

objets mutables: lorsque vous avez une référence à une instance d'un objet, le contenu de cette instance peut être modifié

des Objets Immuables: Quand vous avez une référence à une instance d'un objet, le contenu de cette instance ne peut pas être modifié

comprenons cela avec un exemple:

String myString = new String( "old String" );
System.out.println( myString );
myString = new String( "new String" );
System.out.println( myString );

la sortie de ce est:

old String
new String

maintenant nous trouvons que la valeur affichée par la variable myString a changé. Nous avons défini les objets immuables comme étant incapables de changer de valeur, alors que se passe-t-il? Étendons l'exemple encore une fois pour regarder la variable myString plus près.

String myString = new String( "old String" );
String myCache = myString;
System.out.println( "equal: " + myString.equals( myCache ) );
System.out.println( "same:  " + ( myString == myCache ) );
myString = "not " + myString;
System.out.println( "equal: " + myString.equals( myCache ) );
System.out.println( "same:  " + ( myString == myCache ) );

le résultat de l'exécution est:

equal: true
same:  true
equal: false
same:  false

ce que cela montre est que la variable myString fait référence à une nouvelle instance de la classe String. Le contenu de l'objet n'a pas changé; nous avons écarté l'instance et changé notre référence à une nouvelle avec du nouveau contenu.

1
répondu Chandan Sr 2017-02-25 17:21:23

j'ai modifié le code de william avec un commentaire de sortie pour mieux comprendre

   static void changeStr(String in) { 
      in = in+" changed";
      System.out.println("fun:"+in); //value changed 
    }
    static void changeStrBuf(StringBuffer in) {
      in.append(" changed");   //value changed
    }

    public static void main(String[] args) {
       StringBuffer sb = new StringBuffer("value");
       String str = "value";
       changeStrBuf(sb);
       changeStr(str);
       System.out.println("StringBuffer: "+sb); //value changed
       System.out.println("String: "+str);       // value 
    }

dans le code ci-dessus , regardez la valeur de str à la fois dans main() et changeStr() , même si u r changeant la valeur de str dans changeStr() il affecte seulement à cette fonction mais dans la fonction principale la valeur n'est pas changée , mais elle n'est pas dans le cas de StringBuffer..

dans la valeur changée de StringBuffer est affecté en tant que global..

donc String est immuable et StringBuffer mutable...

en Simple , ce que u a changé en objet String n'affectera que cette fonction en allant au Pool de String. mais pas Changé...

0
répondu Vinay Shanubhag 2016-07-30 12:59:32

une variable mutable est une variable dont la valeur peut changer à sa place, alors que dans une variable immuable le changement de valeur ne se produira pas à sa place. Modifier une variable immuable reconstruira la même variable.

0
répondu Amit Upadhyay 2017-02-02 19:06:16

Mutable signifie que vous recevrez une enregistrer la même référence pour la variable et modifier son contenu, mais immuable, vous ne pouvez pas modifier le contenu, mais vous déclarer de nouvelles de référence contient la nouvelle et l'ancienne valeur de la variable

Ex Immuable - > String

String x = "value0ne";// adresse one x += "valueTwo"; //an other adresse {adresse two} adresse pour le changement de mémoire.

Mutable - > StringBuffer-StringBuilder StringBuilder sb = new StringBuilder(); sb.append("valueOne"); // adresse One sb.append("valueTwo"); // adresse One

sb toujours à la même adresse, j'espère que ce commentaire aide

0
répondu Said BAHAOUARY 2017-07-14 20:59:30

en Java, toutes les chaînes sont immuables(ne peut pas changer). quand vous essayez de modifier une chaîne de caractères, ce que vous faites vraiment c'est en créer une nouvelle .

comment créer L'objet string

  1. l'Aide de la Chaîne littérale

    Strung str= "java";

  2. à l'Aide de mots clés,

    Strung string = new String ("java");

  3. à l'Aide du tableau des caractères

    char [] helloArray = { 'h', 'e', 'L', 'l', 'o', '.

    chaîne helloString = nouvelle chaîne (helloArray);

venir à la Chaîne de l'immutabilité, signifie simplement inmodifiable ou immuable

prenons un exemple

J'initialise la valeur à la chaîne literal s

String s="kumar";

ci-dessous je vais afficher la représentation décimale de l'adresse de localisation en utilisant le hashcode ()

System.out.println(s.hashCode());

il suffit d'Imprimer la valeur d'une chaîne de caractères S

System.out.println("value "+s);

Ok, cette fois je suis inittialisant valeur "kumar" à s1

String s1="kumar";   // what you think is this line, takes new location in the memory ??? 

OK vérifions en affichant le hashcode de l'objet s1 que nous avons créé

System.out.println(s1.hashCode());

OK, vérifions ci-dessous le code

String s2=new String("Kumar");
    System.out.println(s2.hashCode());  // why this gives the different address ??

OK, vérifiez ceci ci-dessous le code enfin

String s3=new String("KUMAR");
    System.out.println(s3.hashCode());  // again different address ???

OUI, si vous voyez des Chaînes de 's' et 's1' avoir le même hashcode parce que la valeur de la rétention par le 's' et 's1' sont les même, c'est - 'kumar'

considérons la chaîne de caractères 's2' et' s3'. ces deux chaînes de caractères hashcode semblent être différentes dans le sens où elles sont toutes deux stockées à un endroit différent. parce que vous voyez, leurs valeurs sont différentes.

puisque s et s1 hashcode sont identiques parce que ces valeurs sont identiques et stockées au même endroit.

exemple 1: Essayez ci-dessous le code et analysez ligne par ligne

public class StringImmutable {
public static void main(String[] args) {

    String s="java";
    System.out.println(s.hashCode());
    String s1="javA";
    System.out.println(s1.hashCode());
    String s2=new String("Java");
    System.out.println(s2.hashCode());
    String s3=new String("JAVA");
    System.out.println(s3.hashCode());
}
}

exemple 2: Essayez ci-dessous le code et analysez ligne par ligne

public class StringImmutable {
    public static void main(String[] args) {

        String s="java";
        s.concat(" programming");  // s can not be changed "immutablity"
        System.out.println("value of s "+s);
        System.out.println(" hashcode of s "+s.hashCode());

        String s1="java";
        String s2=s.concat(" programming");   // s1 can not be changed "immutablity" rather creates object s2
        System.out.println("value of s1 "+s1);
        System.out.println(" hashcode of s1 "+s1.hashCode());  

        System.out.println("value of s2 "+s2);
        System.out.println(" hashcode of s2 "+s2.hashCode());

    }
}

Ok, voyons quelle est la différence entre changeant et immuable.

mutable(changer) vs immuable (il ne peut pas changer)

public class StringMutableANDimmutable {
    public static void main(String[] args) {


        // it demonstrates immutable concept
        String s="java";
        s.concat(" programming");  // s can not be changed (immutablity)
        System.out.println("value of s ==  "+s); 
        System.out.println(" hashcode of s == "+s.hashCode()+"\n\n");


        // it demonstrates mutable concept
        StringBuffer s1= new StringBuffer("java");
        s1.append(" programming");  // s can be changed (mutablity)
        System.out.println("value of s1 ==  "+s1); 
        System.out.println(" hashcode of s1 == "+s1.hashCode());


    }
}

D'autres questions?? veuillez écrire...

0
répondu Kumar Kondiker 2018-06-22 04:49:18