241 votes

Différence entre objet string et le littéral de chaîne

Quelle est la différence entre

et

205voto

Mark Byers Points 318575

Lorsque vous utilisez un littéral de chaîne la chaîne peut être internés , mais lorsque vous utilisez new String("...") que vous obtenez un nouvel objet de type string.

Dans cet exemple, les deux littéraux de chaîne se référer au même objet:

String a = "abc";
String b = "abc";
System.out.println(a == b);  // True

Ici deux objets différents sont créés et ils ont des références différentes:

String c = new String("abc");
String d = new String("abc");
System.out.println(c == d);  // False

En général, vous devez utiliser la chaîne de caractères littérale de la notation lorsque cela est possible. Il est plus facile à lire et ça donne le compilateur une opportunité pour optimiser votre code.

86voto

Andreas_D Points 64111

Un littéral de Chaîne est un langage java concept. C'est une Chaîne de caractères littérale:

"a String literal"

Un objet de type String est une instance individuelle de l' java.lang.String classe.

String s1 = "abcde";
String s2 = new String("abcde");
String s3 = "abcde";

sont toutes valables, mais ont une légère différence: s1 fait référence à une interné objet de type String. Cela signifie, que la séquence de caractères "abcde" sera conservé dans un endroit central et chaque fois que le même littéral "abcde" est encore utilisé, la JVM ne va pas créer un nouvel objet de type String, mais utiliser la référence de la mise en cache des " Cordes.

s2 est garantis pour en faire un nouvel objet String, donc dans ce cas nous avons:

(s1 == s2) is false
(s1 == s3) is true
(s1.equals(s2)) is true

41voto

Jon Points 1381

La réponse longue est disponible ailleurs, je vais donc vous donner le court.

Lorsque vous faites cela:

String str = "abc";

Vous appelez l' intern() méthode sur la Chaîne. Cette méthode fait référence à un pool interne de la "Chaîne" des objets. Si la Chaîne que vous avez appelés intern() sur réside déjà dans la piscine, puis un renvoi vers l' String est attribué à l' str. Si non, alors le nouveau String est placé dans la piscine, et une référence à il est alors attribué à l' str.

Étant donné le code suivant:

String str = "abc";
String str2 = "abc";
boolean identity = str == str2;

Lorsque vous vérifiez l'identité de l'objet en faisant == (vous êtes littéralement à poser - faire de ces deux références pointent vers le même objet?), vous obtenez true.

Cependant, vous n'avez pas besoin d' intern() Strings. Vous pouvez forcer la création sur un new Object sur le Tas en faisant ceci:

String str = new String("abc");
String str2 = new String("abc");
boolean identity = str == str2;

Dans ce cas, str et str2 sont des références à différentes Objects, ni de qui ont été interned , de sorte que lorsque vous testez pour Object d'identité à l'aide de ==, vous obtiendrez false.

En termes de bonnes pratiques de codage - ne pas utiliser == pour vérifier la Chaîne de l'égalité, utilisez .equals() à la place.

37voto

awin Points 66

Comme les Chaînes sont immuables lorsque vous ne

String a = "xyz"

lors de la création de la chaîne de la jvm des recherches dans la piscine de chaînes si il existe déjà une valeur de chaîne "xyz", si " a " sera simplement une référence de cette chaîne et pas de nouvelles de la Chaîne de création de l'objet.

Mais si vous le dites

String a = new String("xyz")

vous force de la jvm pour créer une nouvelle chaîne de référence, même si "xyz" est en itz piscine.

Pour plus d'informations lire http://javatechniques.com/public/java/docs/basics/string-equality.html

17voto

krock Points 13537

"abc" est une Chaîne littérale. En java, ces chaînes littérales sont mis en commun à l'interne et à la même instance de Chaîne d' "abc" est utilisé là où jamais vous avez une chaîne littérale déclarés dans votre code. Donc, "abc" == "abc" sera toujours vrai qu'ils sont tous les deux la même instance de Chaîne.

À l'aide de l' String.intern() méthode, vous pouvez ajouter n'importe quelle chaîne vous le souhaitez à l'intérieur commun chaînes, ceux-ci seront conservés en mémoire jusqu'à ce que java sorties.

d'autre part, l'utilisation d' new String("abc") permettra de créer un nouvel objet de type string dans la mémoire qui est logiquement le même que l' "abc" littérale. "abc" == new String("abc") sera toujours faux, car même si elles sont logiquement égale, ils se réfèrent à des instances différentes.

Habillage d'une Chaîne constructeur autour d'un littéral de chaîne est d'aucune valeur, c'est juste inutilement utilise plus de mémoire que nécessaire.

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