L'éditeur ci-dessous vous présentera un cliché sur les chaînes Java String (un article à lire absolument). L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur et jetons un coup d'œil
Il existe deux formes de création d'objets chaîne en Java, l'une est une forme littérale, telle que String str = "hello";, et l'autre consiste à utiliser les nouvelles méthodes standard. pour construire des objets, tels que String str = new String("hello");
Je n'entrerai pas dans les détails de ce bon sens.
Tout d'abord, la classe String est une classe finale. Pourquoi est-elle définie sous sa forme finale ?
Pour faire simple, pour les types de données qui sont utilisés si fréquemment, les concepteurs pensent qu'ils ont été suffisamment bien conçus et n'ont pas besoin d'être hérités. Sinon, un héritage et une réécriture aléatoires pourraient survenir. réduire les performances des types de données.
Comme le titre l'indique, puisque nous sommes en profondeur, approfondissons les petites actions de String au niveau jvm.
Expliquez d'abord la forme de création littérale :
Lorsqu'une forme littérale apparaît dans le code pour créer un objet chaîne, la JVM va d'abord Le littéral est vérifié et s'il existe une référence à un objet chaîne avec le même contenu dans le pool de constantes de chaîne, cette référence est renvoyée, sinon un nouvel objet chaîne est créé, puis la référence est placée dans le pool de constantes de chaîne et retourné. Citation.
est le suivant :
String str1 = "hello" ;
Lorsque nous le créons pour la première fois, nous pensons ici qu'aucun objet avec le contenu bonjour n'existe. La JVM ne peut pas trouver l'existence d'un objet chaîne avec le contenu bonjour via le pool de constantes de chaîne, elle créera alors l'objet chaîne, puis placera la référence de l'objet nouvellement créé dans le pool de constantes de chaîne et renverra la référence à la variable. str1
S'il existe un tel morceau de code ensuite
String str2 = "hello" ;
De même, la JVM doit toujours détecter ce littéral . La JVM recherche des caractères Dans le pool de constantes de chaîne, il s'avère que l'objet chaîne avec le contenu "hello" existe, donc la référence de l'objet chaîne existant est renvoyée à la variable str2. Notez qu'un nouvel objet chaîne n'est pas recréé ici.
Vérifiez si str1 et str2 pointent vers le même objet. Nous pouvons utiliser ce code
System.out.println(str1 == str2);
Le résultat est vrai.
Le deuxième type est créé en utilisant new :
String str3 = new String("hello");
Lorsque nous utilisons Lorsque new est utilisé pour construire un objet chaîne, un nouvel objet chaîne sera créé, qu'il existe ou non une référence à un objet avec le même contenu dans le pool de constantes chaîne. Nous utilisons donc le code suivant pour le tester,
String str3 = new String("hello"); System.out.println(str1 == str3);
et le résultat est faux. Expliquez que ces deux références pointent vers des objets différents.
intern
Pour l'objet chaîne créé à l'aide de new ci-dessus, si vous souhaitez ajouter la référence de cet objet au pool de constantes de chaîne, vous pouvez utiliser la méthode interne.
Après avoir appelé stagiaire, vérifiez d'abord s'il existe une référence à l'objet dans le pool de constantes de chaîne. S'il existe, renvoyez la référence à la variable. Sinon, ajoutez la référence et renvoyez-la à la variable.
String str4 = str3.intern(); System.out.println(str4 == str1);
Le résultat est vrai.
Des questions
Prérequis ?
La condition préalable à l'implémentation du pool de constantes de chaîne est que l'objet String en Java soit immuable, ce qui peut garantir en toute sécurité que plusieurs variables partagent le même objet. Si l'objet String en Java est mutable et qu'une opération de référence modifie la valeur de l'objet, d'autres variables seront également affectées.
Référence ou objet
Qu'une référence ou un objet soit stocké dans le pool de constantes de chaîne, ce problème est le plus courant. Le pool de constantes de chaîne stocke les références d’objets, pas les objets. En Java, les objets sont créés dans la mémoire tas. Le pool de constantes de chaîne existe dans la génération permanente dans la mémoire du tas
Avantages et inconvénients
L'avantage du pool de constantes de chaîne est de réduire le nombre de chaînes avec la même création de contenu pour économiser de l'espace mémoire.
Si l'on insiste pour parler des inconvénients, c'est sacrifier le temps de calcul du CPU en échange de l'espace. Le temps de calcul du CPU est principalement utilisé pour déterminer s'il existe une référence à un objet avec le même contenu dans le pool de constantes de chaîne. Cependant, son implémentation interne est HashTable, le coût de calcul est donc faible.
Le recyclage des GC ?
Étant donné que le pool de constantes de chaîne contient des références à des objets chaîne partagés, cela signifie-t-il que ces objets ne peuvent pas être recyclés ?
Tout d'abord, les objets partagés dans la question sont généralement relativement petits. Pour autant que je sache, ce problème existait dans les versions antérieures, mais avec l'introduction de références faibles, ce problème devrait désormais disparaître.
usage interne ?
关于使用intern的前提就是你清楚自己确实需要使用。比如,我们这里有一份上百万的记录,其中记录的某个值多次为美国加利福尼亚州,我们不想创建上百万条这样的字符串对象,我们可以使用intern只在内存中保留一份即可。
总有例外?
你知道下面的代码,会创建几个字符串对象,在字符串常量池中保存几个引用么?
String test = "a" + "b" + "c";
答案是只创建了一个对象,在常量池中也只保存一个引用。我们使用javap反编译看一下即可得知。
实际上在编译期间,已经将这三个字面量合成了一个。这样做实际上是一种优化,避免了创建多余的字符串对象,也没有发生字符串拼接问题。
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!