java - String s=new String()与String s = ""的区别
阿神
阿神 2017-04-18 10:50:36
0
4
742

是不是定义字符串如果不使用new来初始化的话相同的字符串会被定义成一个引用

阿神
阿神

闭关修行中......

répondre à tous(4)
左手右手慢动作

Le stockage de String par la JVM est un peu spécial dans la mesure où il y a un morceau de String常量池.
Ce pool constant stocke les références aux objets String.

Par exemple, String s = "abc" vérifiera d'abord s'il existe une référence existante dans String常量池 Sinon, l'abc déclaré générera directement un objet String et stockera une référence pointant vers cette String dans l'objet String常量池.

La chaîne déclarée directement après

suivra également les étapes ci-dessus, donc la deuxième fois String s2 = "abc" trouve une référence de String常量池 pointant vers le premier objet chaîne déclaré.

Et new String("abc") créera un nouvel objet directement dans le tas sans entrer String常量池. Mettre une telle référence d'objet dans le pool constant implique une autre méthode de la classe String intern(), qui renvoie une référence de pool constante d'un objet String. Si cet objet n'est pas dans le pool de constantes, l'objet String sera placé dans le pool de constantes et la référence d'objet correspondante sera renvoyée.

La première méthode de capture d'écran str2.intern() == str3.intern() utilisée dans cette question renverra également true, et la référence intern() renvoyée en appelant String常量池 est la même.

阿神
  1. Tous les types de données non intégrés à Java sont des références.

  2. String s = new String("xx"); Cette méthode créera un espace mémoire et fera pointer la référence vers celui-ci.

  3. String s = "xx"; Cette méthode fera pointer la référence vers un espace partagé.

  4. Lorsqu'ils sont créés à l'aide de new, str2 et str3 pointent vers des espaces mémoire différents, donc str2 et str3 ne sont pas égaux.

  5. Lorsque l'affectation de chaîne est utilisée directement, str2 et str3 pointent vers le même espace mémoire, donc str2 et str3 sont égaux.

  6. Vous pouvez utiliser str2.equals(str3) pour comparer le contenu des chaînes.

洪涛

L'une consiste à stocker dans le pool constant et l'autre à créer un nouvel objet dans le tas

迷茫

Vous aide à comprendre le processus. Il y a quelques points en Java dont vous pouvez vous souvenir
1. Toutes les chaînes seront générées dans le pool constant, correspondant à CONSTANT_String_info, qui est immuable.
2. Les objets ordinaires sont presque toujours générés dans le tas (bien sûr, il existe également des objets spéciaux tels que les objets Class qui peuvent être générés dans la zone de méthode. Cela dépend des différentes implémentations de la machine virtuelle et des spécifications de la machine virtuelle. n'est pas obligatoire)
3.== Lors de cette détermination, pour les types de référence, l'analyse finale consiste à comparer l'adresse mémoire.

D'accord, maintenant que nous avons les concepts ci-dessus. Dans la première question,
String s1 = new String("aaa"); Lorsque vous créez un nouvel objet, jvm vous aidera à ouvrir un espace objet sur le tas, et s1 est stocké dans votre table de variables locales s1. pointe vers cet espace objet (on peut temporairement comprendre que s1 stocke l'adresse de l'espace objet). Vous en avez donc créé deux nouveaux, qui sont deux espaces objets différents. ==Le jugement est bien sûr différent, car s1 et s2 pointent vers des espaces différents.

La deuxième question, le premier point ci-dessus, chaque chaîne n'existera qu'en un seul exemplaire dans le pool constant, donc str2 pointe vers l'adresse de cette chaîne de pool constante, et str3 pointe également vers l'adresse de cette chaîne de pool constante. ==Le jugement est naturellement le même.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal