726 votes

Comment puis-je comparer les chaînes de caractères en Java?

J'ai été en utilisant l' == opérateur dans mon programme de comparer tous mes cordes jusqu'à présent. Cependant, je suis tombé sur un bug, changé l'un d'eux en .equals() au lieu de cela, et il a fixé le bogue.

Est - == mauvais? Quand faut-il et doit-il pas être utilisé? Quelle est la différence?

5450voto

Aaron Maenpaa Points 39173

== tests de référence pour l'égalité.

.equals() des tests de valeur de l'égalité.

Par conséquent, si vous voulez vraiment tester si les deux chaînes ont la même valeur, vous devez utiliser .equals() (sauf dans quelques situations où vous pouvez garantir que deux chaînes de caractères avec la même valeur sera représenté par le même objet, par exemple: Chaîne de stage).

== est pour tester si deux chaînes sont le même objet.

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// concatenation of string literals happens at compile time,
// also resulting in the same object
"test" == "te" + "st" // --> true

// but .substring() is invoked at runtime, generating distinct objects
"test" == "!test".substring(1) // --> false

// interned strings can also be recalled by calling .intern()
"test" == "!test".substring(1).intern() // --> true

Il est important de noter que l' == est un peu moins cher que equals() (une seule référence de comparaison, au lieu d'un appel de méthode), ainsi, dans les situations où elle est applicable (c'est à dire que vous pouvez garantir que vous ne travailler qu'avec des internés de chaînes de caractères), il peut présenter une importante amélioration de la performance. Toutefois, ces situations sont rares.

709voto

Whatsit Points 3292

== tests références de l'objet, .equals() tests de la chaîne de valeurs.

Parfois, il semble comme s' == compare des valeurs, parce que Java fait un peu de derrière-le-scènes de trucs pour s'assurer identiques en ligne, les chaînes de caractères sont en fait le même objet.

Par exemple:

String fooString1 = new String("foo");
String fooString2 = new String("foo");

// Evaluates to false
fooString1 == fooString2;

// Evaluates to true
fooString1.equals(fooString2);

// Evaluates to true, because Java uses the same object
"bar" == "bar";

Mais méfiez-vous des nuls!

== poignées null chaînes fines, mais en l'appelant .equals() d'une chaîne null provoquera une exception:

String nullString1 = null;
String nullString2 = null;

// Evaluates to true
nullString1 == nullString2;

// Throws an Exception
nullString1.equals(nullString2);

434voto

Ganesh Points 793

== compare la référence d'Objet

.equals() compare la Chaîne de valeur

Parfois, == donne des illusions de la comparaison des valeurs de Chaîne, dans les cas suivants

String a="Test";
String b="Test";
if(a==b) ===> true

C'est parce que lorsque vous créez une Chaîne littérale, JVM recherche tout d'abord pour que littéral de Chaîne de la piscine, si elle correspond, même référence sera donnée à cette nouvelle Chaîne, de ce fait nous arriver

(a==b) ===> vrai

                       String Pool
     b -----------------> "test" <-----------------a

== d'échec dans les cas suivants

String a="test";
String b=new String("test");
if (a==b) ===> false

dans ce cas, pour new String("test") la déclaration de la nouvelle Chaîne sera créé dans le segment de référence sera donnée à l' b, alors b sera donnée de référence dans le " tas pas dans la Chaîne de la Piscine. Maintenant, a 'indique la Chaîne dans la Chaîne de la piscine tout en b vers Chaîne dans le tas, parce que nous en sommes arriver

si(a==b) ===> false.

                String Pool
     "test" <-------------------- a

                   Heap
     "test" <-------------------- b

Alors qu' .equals() compare toujours la valeur de la Chaîne de sorte qu'il donne le vrai dans les deux cas

String a="Test";
String b="Test";
if(a.equals(b)) ===> true

String a="test";
String b=new String("test");
if(a.equals(b)) ===> true

Donc à l'aide d' .equals() est awalys mieux.

Espérons que cela aidera.

220voto

Clayton Points 2481

L' == opérateur vérifie si les deux chaînes sont exactement le même objet.

L' .equals() méthode permet de vérifier si les deux chaînes ont la même valeur.

175voto

Faisal Feroz Points 4926

String en java sont immuables cela signifie que chaque fois que vous essayez de modifier/modifier la chaîne que vous obtenez une nouvelle instance. Vous ne pouvez pas modifier la chaîne d'origine. Cela a été fait pour que ces instances de chaîne peut être mis en cache. Un programme typique contient beaucoup de cordes références et la mise en cache de ces instances peut diminuer l'empreinte mémoire et augmenter la performance du programme.

Lors de l'utilisation d'opérateur == pour la comparaison de chaînes vous n'êtes pas en comparant le contenu de la chaîne, mais sont en fait en comparant l'adresse de la mémoire, si elles sont égales, il va retourner true et false sinon. Alors que à égalité dans la chaîne compare le contenu de la chaîne.

Donc, la question est de savoir si toutes les cordes sont mises en cache dans le système, comment se fait - = = renvoie la valeur false alors que de retour est égal à true. Eh bien c'est possible. Si vous faites une nouvelle chaîne de caractères comme String str = new String("Testing") vous finissez par la création d'une nouvelle chaîne dans le cache, même si le cache contient déjà une chaîne ayant le même contenu. En court - "MyString" == new String("MyString") renverra toujours false.

Java parle aussi à propos de la fonction de stagiaire() qui peut être utilisé sur une chaîne pour faire partie de la mémoire cache de sorte "MyString" == new String("MyString").intern() retournera true.

Remarque: l'opérateur == est beaucoup plus rapide d'égale que juste parce que vous êtes la comparaison de deux adresses de mémoire, mais vous devez être sûr que le code n'est pas de créer de nouvelles instances de Chaîne dans le code sinon vous rencontrerez des bugs.

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: