Si la chaîne est une classe comme n’importe quel autre, comment peut il être initialisée à l’aide de guillemets doubles ?
Réponses
Trop de publicités?Les concepteurs de Java ont décidé de conserver les types primitifs dans un langage orienté-objet, au lieu de faire tout un objet, de manière à améliorer les performances de la langue. Les Primitives sont stockées dans la pile d'appel, qui nécessitent moins d'espaces de rangement et sont moins chers à manipuler. D'autre part, les objets sont stockés dans le programme de tas, qui nécessitent des complexes de gestion de la mémoire et de l'espace.
Pour des raisons de performances, de Java String est conçu pour être entre primitive et une classe.
Par exemple
String s1 = "Hello"; // String literal
String s2 = "Hello"; // String literal
String s3 = s1; // same reference
String s4 = new String("Hello"); // String object
String s5 = new String("Hello"); // String object
Remarque :les littéraux de Chaîne sont stockées dans une piscine commune. Cela facilite le partage de stockage pour les chaînes avec le même contenu à conserver la mémoire. String
objets alloués par le biais des nouvelles de l'opérateur sont stockés dans l' heap
, et il n'y a pas de partage d'espace de stockage pour le même contenu.
Java traite la Chaîne comme une classe spéciale, vous pouvez initialiser dans les deux sens
-
Assigner directement littérale
String a = "adsasdf";
-
Comme d'autres Objets à l'aide de mots clés,
String a = new String("adsasdf");
Vous avez besoin de prendre des précautions particulières lorsque l'on veut comparer avec ==
signe:
String a = "asdf";
String b = "asdf";
System.out.println(a == b); // True
System.out.println(a.equals(b)); // True
String a = new String("asdf");
String b = new String("asdf");
System.out.println(a == b); // False
System.out.println(a.equals(b)); // True
C'est parce que dans le premier cas, les objets a et b sont conservés dans quelque chose qui s'appelle literal pool
et ils ont tous deux font référence à un même objet, de sorte qu'ils sont égaux dans les deux sens.
Mais dans le second cas a et b, les références à des objets différents, comme lorsque nous initialiser tous les autres objets. de sorte qu'ils sont inégaux en comparaison avec ==
de l'opérateur alors qu'ils sont égaux en valeurs.
La chaîne obtient le traitement spécial dans la JLS: c'est l'un des deux types de primitives pour lesquelles les littéraux existent (l'autre est - Class
) *.
À partir de la JLS:
Un littéral de chaîne est une référence à une instance de la classe String [...].
* eh bien, il y a aussi le "type null" avec ses "littéral null" null
, mais la plupart des gens ne pensent pas de la "de type null" comme un bon type.