1. Comparer des chaînes

Tout cela est bien et bon. Mais vous pouvez voir que les chaînes s1et s2sont en fait les mêmes, ce qui signifie qu'elles contiennent le même texte. Lorsque vous comparez des chaînes, comment indiquez-vous au programme de ne pas regarder les adresses des Stringobjets, mais leur contenu ?

Pour nous aider avec cela, Stringla classe de Java a la equalsméthode. L'appel ressemble à ceci:

string1.equals(string2)
Comparer deux chaînes

Cette méthode renvoie truesi les chaînes sont identiques et falsesi elles ne sont pas identiques.

Exemple:

Code Note
String s1 = "Hello";
String s2 = "HELLO";
String s3 = s1.toUpperCase();

System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s2.equals(s3));
// Hello
// HELLO
// HELLO

false // They are different
false // They are different
true // They are the same, even though the addresses are different

Plus d'exemples :

Code Explication
"Hello".equals("HELLO")
false
String s = "Hello";
"Hello".equals(s);
true
String s = "Hel";
"Hello".equals(s + "lo");
true
String s = "H";
(s + "ello").equals(s + "ello");
true


2. Comparaison de chaînes insensible à la casse

Dans le dernier exemple, vous avez vu que la comparaison donne . En effet, les cordes ne sont pas égales. Mais..."Hello".equals("HELLO")false

De toute évidence, les cordes ne sont pas égales. Cela dit, leur contenu a les mêmes lettres et ne diffère que par la casse des lettres. Existe-t-il un moyen de les comparer et de ne pas tenir compte de la casse des lettres ? C'est-à-dire, donc ça donne ?"Hello".equals("HELLO")true

Et la réponse à cette question est oui. En Java, le Stringtype a une autre méthode spéciale : equalsIgnoreCase. L'appel ressemble à ceci:

string1.equalsIgnoreCase(string2)

Le nom de la méthode se traduit approximativement par compare but ignore case . Les lettres du nom de la méthode comprennent deux lignes verticales : la première est une minuscule Let la seconde une majuscule i. Ne laissez pas cela vous confondre.

Exemple:

Code Note
String s1 = "Hello";
String s2 = "HELLO";
String s3 = s1.toUpperCase();

System.out.println(s1.equalsIgnoreCase(s2));
System.out.println(s1.equalsIgnoreCase(s3));
System.out.println(s2.equalsIgnoreCase(s3));  
// Hello
// HELLO
// HELLO

true
true
true


3. Exemple de comparaison de chaînes

Donnons juste un exemple simple : supposons que vous deviez saisir deux lignes à partir du clavier et déterminer si elles sont identiques. Voici à quoi ressemblera le code :

Scanner console = new Scanner(System.in);
String a = console.nextLine();
String b = console.nextLine();
String result = a.equals(b) ? "Same" : "Different";
System.out.println(result);

4. Une nuance intéressante de comparaison de cordes

Il y a une nuance importante dont vous devez être conscient.

Si le compilateur Java trouve plusieurs chaînes identiques dans votre code (en particulier dans votre code), il ne créera qu'un seul objet pour elles afin d'économiser de la mémoire.

String text = "This is a very important message";
String message = "This is a very important message";

Et voici ce que la mémoire contiendra en conséquence :

comparaison de chaînes

Et si vous comparez text == messageici, alors vous obtenez true. Ne vous étonnez donc pas.

Si pour une raison quelconque vous avez vraiment besoin que les références soient différentes, alors vous pouvez écrire ceci :

String text = "This is a very important message";
String message = new String ("This is a very important message");

Ou ca:

String text = "This is a very important message";
String message = new String (text);

Dans ces deux cas, les variables textet messagepointent vers des objets différents contenant le même texte.