Maison  >  Questions et réponses  >  le corps du texte

java - String s=new String()与String s = ""的区别

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

阿神阿神2743 Il y a quelques jours697

répondre à tous(4)je répondrai

  • ringa_lee

    ringa_lee2017-04-18 10:52:36

    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.

    répondre
    0
  • 阿神

    阿神2017-04-18 10:52:36

    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.

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-18 10:52:36

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

    répondre
    0
  • 迷茫

    迷茫2017-04-18 10:52:36

    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.

    répondre
    0
  • Annulerrépondre