Deux façons de créer une chaîne et un pool de constantes en Java

Deux façons de créer une chaîne

1. Création constante:

String str1 = "abcd";

Lorsque nous créons une constante de chaîne, la JVM vérifie d'abord le pool de constantes de chaîne. Si la chaîne existe déjà dans le pool de constantes, elle renverra directement la référence d'instance dans le pool de constantes. Si la chaîne n'existe pas dans le pool de constantes, la chaîne sera instanciée et placée dans le pool de constantes. En raison de l'immuabilité des chaînes String, nous pouvons être sûrs qu'il ne doit pas y avoir deux chaînes identiques dans le pool de constantes.

La ligne de code ci-dessus peut être comprise comme: vérifiez le pool de constantes de chaîne là "abcd"- bas , le pool de constantes de chaîne sinon, créez-en un, puis str1pointez sur le pool de constantes de chaîne d'objet. Si oui, alors directement au str1point "abcd";

2. Création d'objets:

String str2 = new String("abcd");//堆中创建一个新的对象
String str3 = new String("abcd");//堆中创建一个新的对象

Cette forme de création est identique à la forme de création d'un objet. L'objet créé est stocké dans le tas et pointe vers la pile. Par conséquent, str2et l' str3adresse mémoire dans la pile, le point de pile “abcd”et l' str1adresse mémoire pointent vers un pool de constantes de chaîne.

Ces deux méthodes de création différentes sont différentes:

  1. La première consiste à obtenir des objets dans le pool de constantes;
  2. La deuxième méthode consiste à créer un nouvel objet directement dans l'espace mémoire du tas.
System.out.println(str1==str2);//false
System.out.println(str2==str3);//false

N'oubliez pas une chose: tant que vous l'utilisez new, vous devez créer un nouvel objet.

Une autre image devrait être plus facile à trier (source de l'image: https://www.journaldev.com/797/what-is-java-string-pool )

Insérez la description de l'image ici

 
 

Piscine constante de chaîne

Le pool de constantes de type String est spécial. Il existe deux manières principales de l'utiliser:

  1. Les objets chaîne déclarés directement à l'aide de guillemets doubles seront directement stockés dans le pool de constantes.
  2. Objet String s'il n'est pas déclaré entre guillemets doubles, String peut être utilisé pour fournir la internméthode.

Supplément: String.intern ()

String.intern()Est une méthode native. Son rôle est:

  1. Si le pool de constantes d'exécution contient déjà une chaîne égale au contenu de cet objet String, une référence à la chaîne dans le pool de constantes sera renvoyée;
  2. Sinon, la méthode de traitement avant JDK1.7 (sans compter la 1.7) consiste à créer une chaîne avec le même contenu que cette chaîne dans le pool de constantes et à renvoyer une référence à la chaîne créée dans le pool de constantes. La méthode de traitement pour JDK1.7 et versions ultérieures consiste à enregistrer la référence de cette chaîne dans le pool de constantes et à renvoyer la référence.
String s1 = new String("计算机");
String s2 = s1.intern();
String s3 = "计算机";
System.out.println(s2);//计算机
System.out.println(s1 == s2);//false,因为一个是堆内存中的 String 对象一个是常量池中的 String 对象,
System.out.println(s3 == s2);//true,因为两个都是常量池中的 String 对象

 

Ajoutez un petit point de connaissance: l'épissage des chaînes:

String str1 = "str";
String str2 = "ing";
		 
String str3 = "str" + "ing";//常量池中的对象
String str4 = str1 + str2; //在堆上创建的新的对象	  
String str5 = "string";//常量池中的对象

System.out.println(str3 == str4);//false
System.out.println(str3 == str5);//true
System.out.println(str4 == str5);//false

Essayez d'éviter la concaténation de plusieurs chaînes, car cela recréera l'objet. Si vous devez modifier la chaîne, vous pouvez utiliser StringBuilder ou StringBuffer.
 
 
ps: Si vous voulez en savoir plus sur 8 types de base de classes d'empaquetage et de pools de constantes, vous pouvez vous référer à un autre de mes blogs:
https://blog.csdn.net/weixin_43901865/article/details/112566955

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43901865/article/details/112782233
conseillé
Classement