Maison >Java >javaDidacticiel >Maîtriser complètement la classe String de Java
Cet article vous apporte des connaissances pertinentes sur java Il présente principalement des problèmes connexes concernant la classe string, notamment le pool constant de chaînes, l'immuabilité des chaînes, etc.
Apprentissage recommandé : "Tutoriel vidéo Java"
Tout d'abord, jetons un coup d'œil au code source de la classe String dans JDK. vous pouvez voir que la classe String a été modifiée par final, ce qui signifie que la classe String ne peut pas être héritée et qu'il n'y a pas de sous-classe de String. De cette façon, toutes les personnes qui utilisent le JDK utilisent la même classe String si String est autorisée. pour être hérité, tout le monde peut étendre la chaîne. La chaîne utilisée par tout le monde n'est pas la même version. Deux personnes différentes utilisent la même méthode et affichent des résultats différents. Cela rend le code impossible à développer. band Tout en apportant de la flexibilité, cela entraînera également de nombreux problèmes de comportement incohérent des sous-classes
String str = " bonjour mot "
String str1 = new String(" hello word ");
char[] data = new char[]{'a', 'b', 'c'};
String str2 = String.valueOf(10);
10.1 ---> double littéral
vrai --> un objet chaîne
String str = "bonjour mot";
String str2 = str; À ce stade, c'est à la fois un littéral d'une chaîne et un objet d'une chaîne. Pour faciliter la compréhension, faites un dessin. pour faciliter la compréhension, nous pensons temporairement qu'il est stocké sur le tas. En fait, il est stocké dans la zone méthode. Si str2 = "Hello" à ce moment-là, cela n'affectera pas la sortie de str. by " " est également un objet chaîne, cela signifie qu'un nouvel espace est ouvert sur le tas à ce moment, et str2 enregistre l'espace d'adressage du nouvel objet à ce moment, ce qui n'a aucun effet sur str
4. La comparaison des chaînes de caractères est égale
Tous les types de données de référence utilisent la méthode égale pour comparer si elles sont égales. Les classes courantes du JDK ont remplacé la méthode égale et peuvent être utilisées directement Les types de données de référence utilisent == pour comparer les adresses
L'image ci-dessous montre deux références pointant vers le même espace d'adressage, qui est lié au pool constant de chaînes
La taille de comparaison égale C'est un comparaison sensible à la casse
La méthode equalsIgnoreCase est une comparaison insensible à la casse
Lors de l'utilisation de la méthode d'affectation directe pour générer un objet de chaîne, la JVM maintiendra un pool de constantes de chaîne si l'objet ne le fait pas. existe dans le tas, un objet chaîne est généré et ajouté au pool de constantes de chaîne ; lorsque vous continuez à utiliser la méthode d'affectation directe pour générer un objet chaîne, la JVM constate que le contenu pointé par la référence existe déjà dans le pool de constantes ; Pour le moment, il n'est pas nécessaire de créer un nouvel objet chaîne, mais de réutiliser directement l'objet existant. C'est pourquoi les trois références dans l'image ci-dessus pointent vers la même adresse
Lorsque l'objet est généré pour la première fois, dans le pool constant S'il n'y a rien, un objet chaîne est généré et stocké dans le pool constant. Lorsque l'objet est généré pour la deuxième et la troisième fois, la JVM constate que le même contenu existe déjà dans le pool constant, donc ce n'est pas le cas. longer génère un nouvel objet et pointe directement vers et Le même espace d'adressage que str1
Le programme est exécuté de droite à gauche À ce stade, le côté droit de la première ligne de code est une constante de chaîne. , qui est également un objet chaîne, alors ouvrez-le d'abord dans le pool constant Un morceau d'espace, puis créez un nouvel objet chaîne et stockez-le. Le programme s'exécute à gauche et rencontre le nouveau mot-clé à ce moment-là. L'objet est créé et stocké dans le tas. Ensuite, str1 pointe vers l'objet dans le tas, puis pointe vers les deuxième et troisième lignes. Lors du codage, on constate que l'objet existe déjà dans le pool constant. Aucune nouvelle création n'est nécessaire. . Lorsque le nouveau mot-clé est rencontré, un nouvel objet est créé. Le diagramme de mémoire est le suivant :
La méthode interne fournie par la classe String, c'est une méthode locale :
.
L'appel de la méthode interne enregistrera l'objet pointé par la référence de chaîne actuelle dans le pool de constantes de chaîne. Il existe deux situations :
1. Si l'objet existe déjà dans le pool de constantes actuel, il ne sera pas généré à nouveau. , renvoie l'objet String dans le pool de constantes
2. Si l'objet n'existe pas dans le pool de constantes actuel, ajoutez l'objet au pool et renvoyez l'adresse après être entré dans le pool.
1. Jetez un œil au résultat des lignes de code suivantes
Parce que la méthode interne a une valeur de retour, str1 appelle uniquement la méthode interne à ce moment et ne reçoit pas la valeur de retour, donc str1 pointe toujours vers l'objet dans le tas, str2 Pointe vers l'objet dans le pool constant, donc il renvoie false
Tant que vous recevez la valeur de retour de l'appel de la méthode interne, elle retournera true ; l'objet pointé par str1 est ajouté manuellement au pool, et le pool a déjà l'objet, laissez directement str1 pointer vers l'objet
2. Regardez la sortie des lignes de code suivantes
Lors de la saisie manuelle du piscine, il n'y a rien dans la piscine, alors déplacez-la directement dans la piscine constante
Remarque : la soi-disant immuabilité de la chaîne signifie que le contenu de la chaîne est immuable, et non que la référence de la chaîne ne peut pas être modifiée
Ici. Immuable fait référence à "hello", "world", "helloworld", "!!!" et l'épissé "helloworld!!!" qui ont été créés comme objets de chaîne, ces objets ne peuvent pas être modifiés une fois déclarés. mais la référence peut être modifiée. Un moment, elle pointe vers bonjour, un autre moment, elle pointe vers bonjour monde, et maintenant elle pointe vers bonjour tout le monde ! ! ! , tout cela est possible
Une chaîne n'est qu'un tableau de caractères -> char[], la chaîne est en fait stockée dans le tableau de caractères. Pourquoi le contenu de la chaîne ne peut-il pas être modifié ? Jetons un coup d'œil au code source de la chaîne et découvrons-le.
Nous pouvons voir que le tableau de caractères à l'intérieur de String est encapsulé. Ce tableau de caractères n'est pas accessible depuis l'extérieur de la classe String, encore moins en modifiant le contenu de la chaîne
String str = " hello ";
1. Détruisez l'encapsulation du tableau de valeurs par réflexion au moment de l'exécution
2. Remplacez la classe StringBuilder ou StringBuffer - - n'est plus du même type
a.StringBuilder : thread dangereux, performances élevées
b .StringBuffer : thread-safe, mauvaises performances
De plus, l'utilisation des deux classes est exactement la même
Si vous devez épisser des chaînes fréquemment, utilisez la méthode append de la classe StringBuilder. Un seul objet est généré ici, qui changera après un certain temps. Cela devient bonjour, et bientôt cela devient bonjour tout le monde
La classe StringBuilder et String sont deux classes indépendantes qui ont été créées pour résoudre le problème de l'épissage des chaînes.
Classe StringBuilder et conversion String Mutual des classes :
1. StringBuilder peut être converti en classe String en appelant la méthode toString
2. La classe String peut être convertie en classe StringBuilder, en utilisant le constructeur ou la méthode append de StringBuilder
.
Autres méthodes courantes :
a. Opération d'inversion de chaîne, reverse() fournie par sb
b Supprimer la plage de données spécifiée, delete(int start, int end); fin, gauche Intervalle ouvert droit fermé
c. Opération d'insertion, insertion (int start, divers types de données) : insérer à partir de la position de l'index de départ, l'index de départ de l'insertion est start
Apprentissage recommandé : " tutoriel vidéo 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!