Pourquoi la classe String en Java est immuable (explication détaillée)
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];}
La valeur de la classe String est stocké dans le tableau de valeurs et modifié par private final
1. La modification privée indique que les classes externes ne peuvent pas accéder à la valeur et que les sous-classes ne peuvent pas y accéder. Bien sûr, la classe String ne peut pas avoir de sous-classes, car la classe. est modifié de manière finale
2. La modification finale indique que la référence de la valeur ne sera pas modifiée et que la valeur ne sera initialisée que dans le constructeur de String, et qu'il n'y a aucun autre moyen de modifier la valeur dans le tableau. Value garantit cela. la référence et la valeur de value ne changeront pas
On dit donc que la classe String est immuable.
Et de nombreuses méthodes, telles que la sous-chaîne, n'opèrent pas sur la classe String d'origine, mais génèrent une nouvelle classe String
public String substring(int beginIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } int subLen = value.length - beginIndex; if (subLen < 0) { throw new StringIndexOutOfBoundsException(subLen); } return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);}
Pourquoi String est-il défini sur indisponible Modifié ?
Pool de constantes de chaînes
Java dispose de 8 types de données de base
Types entiers : octet, court, int, long. Les types d'emballage sont Byte, Short, Integer, Long
Types à virgule flottante : float, double. Le type d'emballage est Float, Double
type de caractère : char. Le type d'emballage est Caractère
Type booléen : booléen. Le type d'emballage est booléen
À l'exception de Float et Double, les 8 types d'emballage n'implémentent pas de pools constants. Le reste est bien sûr implémenté via le mode flyweight
Pools de constantes de classe String. sont implémentés au niveau de la JVM.
Pourquoi y a-t-il un pool constant ?
Le pool constant vise à éviter la création et la destruction fréquentes d'objets qui affectent les performances du système, et il implémente le partage d'objets.
Par exemple, le pool de constantes de chaîne place tous les littéraux de chaîne dans un pool de constantes pendant la phase de compilation.
Économisez de l'espace mémoire : toutes les constantes de chaîne identiques dans le pool de constantes sont fusionnées et n'occupent qu'un seul espace.
Gagnez du temps d'exécution : lors de la comparaison de chaînes, == est plus rapide que equals(). Pour deux variables de référence, utilisez simplement == pour déterminer si les références sont égales, et vous pouvez également déterminer si les valeurs réelles sont égales.
Où se trouve le pool de constantes de chaîne ?
Je ne discuterai de rien avant jdk1.7. À partir de jdk1.7, le pool de constantes de chaîne a commencé à être placé dans le tas, puis tout le contenu de cet article est basé sur jdk1. 8
Le code suivant est encore souvent demandé
String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); String str4 = new String("abc"); // trueSystem.out.println(str1 == str2); // falseSystem.out.println(str1 == str3); // falseSystem.out.println(str3 == str4);
La structure en mémoire est la suivante
Les magasins de pool constants références
Expliquez le résultat du code ci-dessus. Il existe deux façons de créer des objets chaîne en Java
String str1 = "abc"; String str2 = "abc"; // trueSystem.out.println(str1 == str2);
Lors de la création d'une chaîne en utilisant une valeur littérale, la JVM supprimera d'abord le string Rechercher si l'objet "abc" existe dans le pool
S'il n'existe pas, créez l'objet "abc" dans le pool de chaînes, puis attribuez l'adresse de l'objet "abc" dans le pool à str1, pour que str1 Il pointera vers l'objet chaîne "abc" dans le pool
S'il existe, aucun objet ne sera créé, et l'adresse de l'objet "abc" dans le pool sera directement renvoyée et attribué à str2. Étant donné que str1 et str2 pointent vers l'objet "abc" dans le même pool de chaînes, le résultat est vrai.
String str3 = new String("abc"); String str4 = new String("abc"); // falseSystem.out.println(str3 == str4);
Lorsque vous utilisez le nouveau mot-clé pour créer un objet chaîne, la JVM recherche d'abord l'objet chaîne "abc" dans le pool de chaînes
Sinon, elle recherche d'abord l'objet chaîne dans. le pool de chaînes. Créez un objet chaîne "abc" dans le pool, puis créez un objet chaîne "abc" dans le tas, puis attribuez l'adresse de l'objet chaîne "abc" dans le tas à str3
s'il y en a un, alors au lieu de créer l'objet "abc" dans le pool, créez un objet chaîne "abc" directement dans le tas, puis attribuez l'adresse de l'objet "abc" dans le tas à str4. De cette façon, str4 pointe vers l'objet chaîne "abc" créé dans le tas
Parce que str3 et str4 pointent vers des objets chaîne différents, le résultat est faux ;
Mise en cache du HashCode
Lorsque la classe String est créée, le hashcode est mis en cache dans la variable membre de hachage car la classe String est immuable, donc le hashcode ne changera pas. De cette façon, chaque fois que vous souhaitez utiliser le hashcode, vous pouvez simplement le prendre directement sans recalculer, ce qui améliore l'efficacité
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** Cache the hash code for the string */ private int hash; // Default to 0 }
Peut être utilisé comme clé de HashMap
En raison de la nature immuable de la classe String, elle est souvent utilisée comme clé de HashMap. Si la classe String est variable et que le contenu change, le hashCode changera également lors de sa récupération. le HashMap basé sur cette clé, il se peut qu'il ne soit pas récupéré ou qu'il obtienne une mauvaise valeur
La sécurité des threads
Les objets immuables sont intrinsèquement. thread-safe, ce qui peut éviter des problèmes dans les environnements multithread. Ensuite, effectuez des opérations de synchronisation sur String.
Merci à tous d'avoir lu, j'espère que vous en bénéficierez beaucoup.
Cet article est reproduit à partir de : https://blog.csdn.net/zzti_erlie/article/details/106872673
Tutoriel recommandé : "Tutoriel Java"
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!