Les parties de chaîne sont des chaînes [6]:
["231", "CA-California", "Sacramento-155328", "aleee", "Customer Service Clerk", "Alegra Keith.doc.txt"]
Mais quand je compare parts[0]
avec "231"
:
"231" == parts[0]
le résultat ci-dessus est faux,
Je suis confus, alors quelqu'un pourrait-il me dire pourquoi?
L'opérateur ==
Compare les références d'objet, pas la valeur des String
s.
Pour comparer les valeurs de String
s, utilisez la méthode String.equals
:
"231".equals(parts[0]);
Cela est vrai avec tout autre objet dans Java - lors de la comparaison de valeurs, utilisez toujours la méthode equals
plutôt que d'utiliser l'opérateur ==
.
La méthode equals
fait partie de Object
, et doit être remplacée par des classes qui seront comparées d'une manière ou d'une autre.
Si les chaînes ne sont pas internes, alors == vérifie l'identité de référence. Utilisation:
"231".equals(parts[0]);
au lieu.
==
Dans Java compare l'adresse des objets (des chaînes dans ce cas).
Ce que vous voulez c'est parts[0].equals("231")
Ce qui suit imprime "vrai";
String s = "231";
if(s == "231")
{
System.out.println("true");
}
else
{
System.out.println("false");
}
En effet, les chaînes ne sont pas modifiables et Java essaiera d'économiser autant d'espace que possible, il pointe donc les deux vers la même référence de mémoire.
Cependant, ce qui suit affiche "faux":
String s = new String("231");
if(s == "231")
{
System.out.println("true");
}
else
{
System.out.println("false");
}
new
le forcera à stocker la chaîne dans un nouvel emplacement mémoire.
Soit dit en passant, vous devriez TOUJOURS utiliser .equals()
pour comparer les chaînes (pour des cas comme celui-ci)
Utilisez la méthode equals: parts [0] .equals ("231"). L'opérateur == compare les références d'objets.
"==" compare les références d'objet, dans votre cas "231" est un objet différent de parts [0].
Vous souhaitez utiliser String.equals .
parts[0].equals("231")
La réponse est très simple: lorsque vous comparez des chaînes via l'opérateur ==, vous comparez réellement si deux variables différentes se réfèrent à un seul objet String. Et ce n'est pas le cas, la chaîne dans le tableau et le "231" nouvellement créé sont des objets String différents avec le même contenu.
La bonne chose à faire est d'utiliser l'expression suivante: "231".equals(parts[0])
ou "231".equalsIgnoreCase(parts[0])
. Cela vous donnera ce dont vous avez besoin et retournera vrai si ces objets String contiennent les mêmes valeurs.
J'ai pensé qu'il pourrait être utile d'exprimer la réponse dans un scénario de test:
public class String231Test extends TestCase {
private String a;
private String b;
protected void setUp() throws Exception {
a = "231";
StringBuffer sb = new StringBuffer();
sb.append("231");
b = sb.toString();
}
public void testEquals() throws Exception {
assertTrue(a.equals(b));
}
public void testIdentity() throws Exception {
assertFalse(a == b);
}
}
Vous pouvez également utiliser la méthode compareTo (String) :
String str = "test";
if( str.compareTo("test") == 0)
//the argument string is equal to str;
else
//the argument string is not equal to str;
Voici un bel exemple. L'opérateur '==' avec une chaîne peut être très délicat en Java.
class Foo {
public static void main(String[] args) {
String a = "hello";
String b = "hello";
String c = "h";
c = c + "Ello";
String operator = null;
if(a == b) {
operator = " == ";
} else {
operator = " != ";
}
System.out.println(a + operator + b);
if(a == c) {
operator = " == ";
} else {
operator = " != ";
}
System.out.println(a + operator + c);
if(a == "hello") {
operator = " == ";
} else {
operator = " != ";
}
System.out.println(a + operator + "hello");
if(c == "hello") {
operator = " == ";
} else {
operator = " != ";
}
System.out.println(c + operator + "hello");
}
}
Ce qui produira la sortie suivante:
hello == hello
hello != hello
hello == hello
hello != hello
Utilisez la méthode equals pour comparer des objets:
String[] test = {"231", "CA-California", "Sacramento-155328", "aleee",
"Customer Service Clerk", "Alegra Keith.doc.txt"};
System.out.println("231".equals(test[0]));
La comparaison '==' compare les références, pas les valeurs.
Comme beaucoup d'autres l'ont déjà expliqué, vous essayez de comparer avec l'opérateur d'égalité, mais il s'appuierait alors sur Object.equals () au lieu de String.equals ().
Vous pouvez donc faire le travail en appelant explicitement String.equals (), mais au lieu d'écrire
parts[0].equals("blahblah")
Je préférerais une telle:
"blahblah".equals(parts[0])
Comme cela évite de tester la nullité potentielle des parties [0] (mais attention à ce que la variable des pièces elle-même puisse être nulle ...)
Une autre façon utilise String.intern ():
if (parts[0].intern() == "blahblah") ...
Voir http://Java.Sun.com/j2se/1.4.2/docs/api/Java/lang/String.html#intern () pour plus d'informations à ce sujet.