Question

Chaque fois que j'utilise la méthode equals () avec deux objets StringBuffer différents, le résultat est faux, mais lorsque j'utilise la méthode equals () avec deux objets String différents, le résultat est vrai. Pourquoi?

    String s=new String("434");
    String s1=new String("434");

    System.out.println(s.equals(s1));//true

   StringBuffer s=new StringBuffer("434");
   StringBuffer s1=new StringBuffer("434");

   System.out.println(s.equals(s1));//false
Était-ce utile?

La solution

StringBuffer ne remplace pas equals (). En tant que tel, Object.equals () est appelé, qui compare l'identité de l'objet (l'adresse mémoire). La chaîne annule et compare le contenu.

Autres conseils

StringBuffer ne remplace pas Object # equals () , de sorte que vous rencontrez des contrôles basés sur une identité de référence plutôt que sur une valeur . contrôles basés sur . Comme ces instances StringBuilder sont distinctes, chacune avec des emplacements de mémoire différents, l'implémentation de base Object # equals () renverra toujours false.

Voici la définition de Java 6:

public boolean equals(Object obj) {
  return (this == obj);
}

Voir le problème?

Du moins dans ma version du JDK (Sun 1.6), StringBuffer n’implémente pas une méthode equals (). Cela signifie qu'il hérite de la méthode equals () de Object, identique à ==

Si vous voulez vraiment tester l'égalité de deux StringBuffers, vous pouvez appeler x.toString (). equals (y.toString ())

Si vous souhaitez comparer les représentations sous forme de chaîne des deux objets StringBuffer, procédez comme suit:

StringBuffer sb1 = new StringBuffer("434");
StringBuffer sb2 = new StringBuffer("434");
if (sb1.toString().equals(sb2.toString())) {
  // whatever you want to do if they're equal
} else {
  // whatever you want to do if they're not
}

Sinon, vous comparez l'égalité des deux objets StringBuffer , et non leur contenu. En d'autres termes, vous exécutez Object # equals () et non (le non-existant) StringBuffer # égal. ().

equals ne renvoie true que sur les objets StringBuffer lorsque les deux objets sont identiques. Pour comparer StringBuffers comme vous le souhaitez, utilisez ceci:

System.out.println(s.toString().equals(s1.toString());

String s.equals utilisera la table des chaînes pour comparer les chaînes réelles. En tant que StringBuffer, sb.equals utilisera simplement l'implémentation par défaut de la méthode equals et comparera simplement les pointeurs d'objet.

StringBuffer n'a pas sa propre implémentation de la méthode equals, il hérite de la classe equals () de la classe d'objet, c'est pourquoi les valeurs de hachage sont comparées au lieu de comparer le contenu réel dans le stringBuffer. Par conséquent, nous devons explicitement le convertir en un objet chaîne fournissant l’implémentation de la méthode equals ().

La sémantique de l'objet String est telle que si deux occurrences contiennent la même séquence de caractères, elles contiendront toujours la même séquence de caractères et on pourrait - au moins de le point de vue de l'objet String lui-même - remplace toutes les références à l'une des chaînes par des références à l'autre sans changer la sémantique du programme. De telles instances peuvent être considérées comme équivalentes car, à toutes fins pratiques, la seule information encapsulée dans une instance de String est la séquence de caractères contenus dans l'instance cible.

En revanche, une variable de type StringBuffer encapsule non seulement une séquence de caractères, mais également l'identité d'une instance particulière . Si deux variables font référence à la même instance, le passage à l'instance référencée par une variable affectera l'instance référencée par l'autre (puisqu'il s'agit de la même instance). S'ils font référence à différentes instances, les modifications apportées à l'instance référencée par l'une n'affecteront pas l'instance référencée par l'autre. La décision de ne pas remplacer le code StringBuffer de Java par égal à n'était pas le résultat de la paresse, mais était plutôt basée sur le fait que les objets StringBuffer ont identité significative, et les instances disjointes ont toujours des identités différentes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top