Dans cette fiche...

<Retour>

Description de l'applet

Difficulté : Résultat

Un piège classique pour les débutants en Java : la comparaison de 2 chaînes de caractères.

 

Votre navigateur n'est pas compatible Java !

Listing de l'applet

// --------------------------------------------------
// COMPARAISON DES CHAINES DE CARACTERES
// --------------------------------------------------
import java.applet.*;
import java.awt.*;
public class Compar extends Applet
{
	String s1, s2, s3, s4;
	public void init()
	{
		// Définir la couleur de fond de l'applet
		setBackground(Color.black)
		s1 = new String("Loi du frisbee");
		s2 = new String("Plus le disque ira loin,");
		s3 = new String("moins ce sera dans la direction voulue.");
		s4 = new String("Plus le disque ira loin,");
	}
	// La méthode paint() est appelée à chaque fois que l'applet
	// est dessinée à l'écran.
	public void paint(Graphics g)
	{
		// Affichage des chaînes s1, s2 et s3, juste pour faire joli.
		g.setColor(Color.yellow);
		g.drawString("s1 = "+s1, 10, 15);
		g.setColor(Color.orange);
		g.drawString("s2 = "+s2, 10, 25);
		g.drawString("s3 = "+s3, 10, 35);
		g.drawString("s4 = "+s4, 10, 45);
		g.setColor(Color.white);


		// Tester l'égalité de 2 chaînes (mauvaise méthode)
		if (s2 == s4)
			g.drawString("Les chaînes s2 et s4 sont égales.", 10, 60);
		else
			g.drawString("Les chaînes s2 et s4 sont différentes.", 10, 60);
		// Tester l'égalité de 2 chaînes (bonne méthode)
		if (s2.equals(s4))
			g.drawString("Les chaînes s2 et s4 sont égales.", 10, 70);
		else
			g.drawString("Les chaînes s2 et s4 sont différentes.", 10, 70);
	}
}

Télécharger le listing

Le listing en détail...

Seules les nouveautés par rapport aux listings précédents sont commentées ici.

// Tester l'égalité de 2 chaînes (mauvaise méthode)
if (s2 == s4)
	g.drawString("Les chaînes s2 et s4 sont égales.", 10, 60);
else
	g.drawString("Les chaînes s2 et s4 sont différentes.", 10, 60);
Lorsqu'on fait une comparaison de 2 chaînes, on est tenté d'utiliser le double-égal (==), comme ci-dessus.
Cet == fonctionne sur les types simples (int par exemple), mais pas sur les objets.
Dans l'exemple ci-dessus, le programme affiche :

Les chaînes s2 et s4 sont différentes

même si elles contiennent la même chose. Il s'agit de textes identiques, mais d'objets différents.
Pour les habitués : les 2 chaînes sont gérées par des pointeurs différents, et ne sont pas égales.
Donc pas bon !

   
// Tester l'égalité de 2 chaînes (bonne méthode)
if (s2.equals(s4))
	g.drawString("Les chaînes s2 et s4 sont égales.", 10, 70);
else
	g.drawString("Les chaînes s2 et s4 sont différentes.", 10, 70);
La bonne méthode consiste à utiliser la méthode equals() de l'une des chaînes.
s2.equals(s4) renvoie true (vrai) ou false (faux) selon que les 2 objets String contiennent ou non la même chose.
A noter que s2.equals(s4) donne le même résultat que s4.equals(s2). Ca rassure, non ?

Autre variante :
La méthode equals() est sensible aux majuscules/minuscules.
Exemple :

s2 = "bonjour";
s4 = "Bonjour";
x = s2.equals(s4);

A la fin de ce programme, x vaut false, à cause du B de Bonjour.
Si vous souhaitez comparer les 2 chaînes sans tenir compte des majuscules/minuscules, faites :

x = s2.equalsIgnoreCase(s4);

Dans ce cas, x vaut true.

Intégration de l'applet dans la page

Voici le code qui a été utilisé dans cette page HTML pour faire apparaître l'applet :

<applet code="Compar.class" width=250 height=90>
Votre navigateur n'est pas compatible Java !
</applet>

Pour plus de précisions sur l'intégration d'une applet, cliquez ici.