Quelle est la différence entre
et
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.
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
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.
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
"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 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.