2012-04-12 3 views
2

Possible en double:
Difference Between Equals and ==
In JDK 1.6, can String equals operation can be replaced with ==?
How do I compare strings in Java?Résultat inattendu, lorsque l'on compare deux Java Strings avec "=="

Tout en jouant avec Java Strings, i n'espérait pas les résultats suivants:

public class Sandbox { 
    public static void main(String[] args) { 
     String a = "hello"; 
     String b = "hello"; 

     System.out.println(a == b);    //true  Why?, a and b both are seperate Objects 
     System.out.println(a == "hello");  //true  Why? 
     System.out.println(a == new String(b)); //false  As expected 
    } 
} 

Je m'attendais à ce que tout soit faux, puisque "==" compare les références. Pourquoi ce résultat?

Lorsque je change String b = "world", System.out.println(a == b); renvoie false. Il semble que le contenu du String-Object soit comparé.

Étant donné que Java 7 peut comparer les chaînes dans les instructions switch-case, j'ai pensé qu'il pourrait avoir quelque chose à voir avec la version Java. Mais comme décrit here, la méthode equals est invoquée lors de la comparaison de chaînes dans un Switch-Case.

+0

Veuillez lire [this] (http://stackoverflow.com/questions/971954/difference-between-equals-and). – mre

+0

En résumé, certaines chaînes sont internées (c'est-à-dire mises en cache) et font référence au même objet, ce qui explique pourquoi == peut fonctionner. Mais vous ne pouvez pas compter sur ce mécanisme et vous devez utiliser des égaux. – assylias

+0

La ligne de fond est, comme une chaîne est encore et objet, donc dans la grande majorité des cas, vous devriez utiliser la méthode 'equals'. –

Répondre

2

La machine virtuelle Java exécute some trickery lors de l'instanciation de littéraux de chaîne afin d'augmenter les performances et de réduire les frais généraux de mémoire. Pour réduire le nombre d'objets String créés dans la JVM, la classe String conserve un pool de chaînes. Chaque fois que votre code crée un littéral de chaîne, la JVM vérifie d'abord le pool de littéraux de chaîne. Si la chaîne existe déjà dans le pool, une référence à l'instance regroupée est renvoyée. Si la chaîne n'existe pas dans le pool, un nouvel objet String est instancié, puis placé dans le pool. Java peut faire cette optimisation puisque les chaînes sont immuables et peuvent être partagées sans crainte de corruption de données.

+3

Il est appelé * string interning * et est commun dans la plupart des langues modernes - http://en.wikipedia.org/wiki/String_interning –

+0

Oui, il a déjà été expliqué dans d'autres commentaires. Certains trickery_ aurait pu être vague. – Anonymous

3

Java a toujours (à partir de la version 1.0) des littéraux de chaîne internés. Cela signifie que les chaînes constantes sont ajoutées à un pool et que les doublons font référence au même objet.

final String a = "hello"; 
final String b = "hell"; 
System.out.println(a == b + 'o'); 

Cette imprime true que le compilateur peut ligne et simplifier l'expression b + 'o' être le même que « bonjour ».