Maison > Java > javaDidacticiel > La chaîne est-elle mutable en Java ? (exemples détaillés)

La chaîne est-elle mutable en Java ? (exemples détaillés)

不言
Libérer: 2018-09-17 17:12:15
original
2283 Les gens l'ont consulté

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
    
    // ...
    
}
Copier après la connexion

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.

String est-il vraiment « 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
Copier après la connexion

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.

La chaîne est-elle mutable en Java ? (exemples détaillés)

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.

String est-il vraiment « immuable » ?

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] = &#39;J&#39;;
value[7] = &#39;a&#39;;
value[8] = &#39;v&#39;;
value[9] = &#39;a&#39;;
value[10] = &#39;!&#39;;
value[11] = &#39;!&#39;;
System.out.println(str); // Hello Java!!
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal