66 votes

Ce qui rend la référence de comparaison (==) de travail pour certaines chaînes de caractères en Java?

J'ai suivant les lignes de codes pour comparer Chaîne. str1 pas égal à str2, ce qui est compréhensible puisqu'il compare la référence d'objet. Mais alors, pourquoi s1 est égale à s2?

String s1 = "abc";
String s2 = "abc";

String str1 = new String("abc");
String str2 = new String("abc");

if (s1==s2)
    System.out.println("s1==s2");           
else
    System.out.println("s1!=s2");

if (str1==str2)
    System.out.println("str1==str2");           
else
    System.out.println("str1!=str2");

if (s1==str1)
    System.out.println("str1==s1");         
else
    System.out.println("str1!=s1");

Sortie:

  s1==s2
  str1!=str2
  str1!=s1 

92voto

berry120 Points 21945

La constante de chaîne piscine essentiellement en cache tous les littéraux de chaîne, de sorte qu'ils sont le même objet-dessous, qui est pourquoi vous voyez la sortie que vous faites pour s1==s2. Il s'agit essentiellement d'une optimisation dans la machine virtuelle afin d'éviter de créer un nouvel objet string à chaque fois qu'un littéral est déclarée, ce qui pourrait être très coûteux très rapidement! Avec votre str1==str2 exemple, vous êtes, indiquez explicitement la machine virtuelle pour créer de nouveaux objets string, donc pourquoi il est faux.

En aparté, l'appel de la intern() méthode sur n'importe quelle chaîne sera ajoutée à la constante de la piscine (et le retour de la Chaîne qui il est ajouté à la piscine.) Ce n'est pas forcément une bonne idée de faire cela, cependant, sauf si vous êtes sûr que vous avez affaire avec des chaînes qui va certainement être utilisé en tant que constantes, sinon vous risquez de créer des dur pour traquer les fuites de mémoire.

22voto

Chandra Sekhar Points 6512

s1 et s2 sont des littéraux de Chaîne. Lorsque vous créez une nouvelle Chaîne de caractères littérale le compilateur vérifie d'abord si un littéral représentant le même est présent dans la Chaîne de la piscine ou non. Si il y en a un présent, le compilateur renvoie que littérale sinon le compilateur crée un nouveau.

Lorsque vous avez créé la Chaîne s2 le compilateur renvoie la Chaîne de caractères s1 de la piscine comme il a déjà été créé avant. C'est la raison pourquoi s1 et s2 sont même. Ce comportement est appelé en stage.

11voto

Bohemian Points 134107

Ce phénomène est dû à la Chaîne de stage.

Fondamentalement, tous les littéraux de chaîne sont "en cache" et réutilisés.

5voto

GETah Points 10887

Cela est dû à des littéraux de Chaîne d'être interné. Sur cette question, Java documentations dit:

Toutes les chaînes littérales et de la chaîne de valeur de la constante d'expressions interné

Et c'est ce qui explique pourquoi s1 et s2 sont les mêmes (ces deux variables pointent vers le même interné chaîne)

5voto

zsxwing Points 4216

En Java, la même constante des chaînes qui peuvent être réutilisées. De sorte qu' s1 et s2 le point sur la même "abc" de l'objet et de l' s1==s2. Mais lorsque vous utilisez new String("abc"), un autre objet sera créé. De sorte qu' s1 != str1.

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