122 votes

Les chaînes sont des objets en Java, donc pourquoi ne pas utiliser "nouveaux" pour les créer?

Nous avons l'habitude de créer des objets à l'aide de l' new mot-clé, comme:

Object obj = new Object();

Les chaînes sont des objets, mais nous n'utilisons pas d' new de créer:

String str = "Hello World";

Pourquoi est-ce? Puis-je faire une Chaîne avec des new?

144voto

danben Points 35312

En plus de ce qui a déjà été dit, Chaîne de caractères littéraux [c'est à dire, comme les Chaînes "abcd" mais pas comme new String("abcd")] en Java sont internés, ce qui signifie que chaque fois que vous vous référez à "abcd", vous obtenez une référence à un seul String exemple, plutôt que d'un nouveau à chaque fois. Ainsi, vous aurez

String a = "abcd";
String b = "abcd";

a == b; //True

mais si vous aviez

String a = new String("abcd")
String b = new String("abcd")

ensuite, il est possible d'avoir

a == b; // False

(et au cas où quelqu'un a besoin de le rappeler, toujours utiliser .equals() pour comparer des Chaînes; == tests pour objet l'égalité)

Stage littéraux de Chaîne est bonne, car ils sont souvent utilisés plus d'une fois. Par exemple, considérons l' (fictive) du code:

for (int i = 0; i < 10; i++) {
  System.out.println("Next iteration");
}

Si nous n'avions pas un stage de Cordes, la "Prochaine version" devra être instancié 10 fois, alors que maintenant, il ne sera instancié une seule fois.

37voto

Jamie McCrindle Points 3347

Les chaînes sont "spéciales" des objets en Java. La Java des designers sagement décidé que les Chaînes de caractères sont utilisés si souvent qu'ils ont besoin de leur propre syntaxe ainsi que d'une stratégie de mise en cache. Lorsque vous déclarez une chaîne en disant:

String myString = "something";

machaine est une référence à l'objet String avec une valeur de "quelque chose". Si plus tard vous déclarer:

String myOtherString = "something";

Java est assez intelligent pour comprendre que myString et myOtherString sont les mêmes et les stocker dans une Chaîne globale de table comme le même objet. Il s'appuie sur le fait que vous ne pouvez pas modifier les Cordes pour le faire. Ceci réduit la quantité de mémoire requise et permet de faire des comparaisons plus rapide.

Si, au lieu de cela, vous écrivez

String myOtherString = new String("something");

Java va créer une nouvelle marque d'objet pour vous, distincte de la myString objet.

21voto

Crocode Points 337

String a = "abc"; // 1 Object

String b = "abc"; // 0 Object

String c = new String("abc"); // 1 Object

String d = new String("def"); // 1 Object + "def" is added to the Pool

String e = d.intern(); // (e==d) is "false" because e refers to the String in pool

String f = e.intern(); // (f==e) is "true"

Total d'Objets: 4 (a, c, d, "def").

Espérons que cela efface les quelques doutes. :)

6voto

Malfist Points 10488

C'est un raccourci. Il n'était pas à l'origine de ce genre, mais Java changé.

Cette FAQ en parle brièvement. Les Spécifications de Java guide en parle aussi. Mais je ne peux pas le trouver en ligne.

6voto

Brian Agnew Points 143181

La chaîne est soumis à un couple d'optimisations (faute d'une meilleure expression). Notez que la Chaîne a également la surcharge d'opérateur (pour les + de l'opérateur) - contrairement à d'autres objets. Il est donc très bien d'un cas particulier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X