Maison  >  Article  >  Java  >  Pourquoi la classe String en Java est-elle immuable (explication détaillée)

Pourquoi la classe String en Java est-elle immuable (explication détaillée)

烟雨青岚
烟雨青岚avant
2020-06-24 13:27:146617parcourir

Pourquoi la classe String en Java est-elle immuable (explication détaillée)

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
Pourquoi la classe String en Java est-elle immuable (explication détaillée)
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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer