Le contenu de cet article porte sur la question de savoir si String en Java est mutable ? (Explication détaillée des exemples) a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère que cela vous sera utile.
Nous savons tous que la classe String en Java est conçue pour être immuable. Jetons un coup d'œil au code source de la classe String.
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 // ... }
On voit que la classe String est de type final et String ne peut pas être héritée. Sa valeur value est l'encapsulation du tableau de caractères, c'est-à-dire char[]. Sa valeur est définie comme private final, ce qui signifie qu'elle ne peut pas être modifiée par le monde extérieur, c'est-à-dire qu'elle est immuable.
Regardez l'exemple ci-dessous.
String str = "Python"; System.out.println(str); // Python str = "Java"; System.out.println(str); // Java str = str.substring(1); System.out.println(str); // ava
Vous vous demandez peut-être : str n'est-il pas passé de Python à Java ? Ensuite, cela devient ava grâce à la méthode des sous-chaînes ?
C'est en fait un malentendu parmi les débutants. En regardant la structure de String ci-dessus, nous pouvons savoir que les chaînes sont composées de tableaux de caractères. str n'est qu'une référence. changé plus tard en "Java", et la sous-chaîne utilise également la méthode Arrays.copyOfRange pour recopier le tableau de caractères afin de construire une nouvelle chaîne.
Donc, la chaîne ici n'est pas variable, elle change simplement la référence de la chaîne.
Pour plus d'informations sur les différences entre les sous-chaînes dans les différentes versions du JDK, vous pouvez lire cet article "Remarque : Différences dans les méthodes de sous-chaîne de chaîne dans jkd6, 7 et 8". version de la sous-chaîne.
L'exemple ci-dessus est définitivement immuable, mais le suivant est embarrassant.
String str = "Hello Python"; System.out.println(str); // Hello Python Field field = String.class.getDeclaredField("value"); field.setAccessible(true); char[] value = (char[])field.get(str); value[6] = 'J'; value[7] = 'a'; value[8] = 'v'; value[9] = 'a'; value[10] = '!'; value[11] = '!'; System.out.println(str); // Hello Java!!
Par réflexion, nous modifions la valeur du tableau de caractères sous-jacent et réalisons l'"immuabilité" de la chaîne. Il s'agit d'une opération astucieuse et n'est pas recommandée. Elle viole les exigences de Java pour String. Le principe de conception des classes entraînera des problèmes de sécurité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!