I. Introduction

Les chaînes de caractères (que nous appellerons "strings" par la suite) sont souvent utilisées en programmation. Un string est une suite ou une séquence de caractères.

Dans beaucoup de langages un string n'est autre qu'un tableau de caractères, alors qu'en Java un string est un objet.

En fait, Java propose 3 classes apparentées aux chaînes de caractères :
  • La classe String (chaîne de caractères non modifiables)
  • La classe StringBuffer (chaîne de caractères modifiables à volonté)
  • La classe StringTokenizer (séparation d'une chaîne en plusieurs entités)

Dans la plupart des cas il convient d'utiliser String pour créer, stocker et gérer des chaînes de caractères.
La classe StringBuffer permet une plus grande souplesse et s'utilise de la même manière que la classe String.

II. La classe String

Cette classe dispose de 11 constructeurs et plus de 40 méthodes pour examiner les caractères d'une chaîne, comparer, chercher, extraire, etc. Parmi ces méthodes, certaines sont décrites ci-dessous. On peut trouver les autres dans l'aide de Java.

II.1. Construction d'un String

Une chaîne de caractères se déclare normalement de la manière suivante :

 
Sélectionnez

	String prenom = new String("Pierre");

Comme les strings sont un type de donnée très utilisé, Java permet une déclaration plus concise :

 
Sélectionnez

	String prenom = "Pierre";

II.2. Comparaison de strings

On peut être tenté de comparer deux strings à l'aide de l'opérateur == comme dans :

 
Sélectionnez

	if (str1 == str2) ...

Or, cette comparaison, bien que correcte, ne compare pas si les deux chaînes sont égales, mais si str1 et str2 pointent vers le même objet.

Une comparaison de chaînes s'effectue de la manière suivante :

 
Sélectionnez

	if (str1.equals(str2)) ...

Il existe aussi la méthode compareTo :

 
Sélectionnez

	str1.compareTo(str2);

Cette méthode retourne 0 si les deux chaînes sont égales, une valeur négative si str1 est plus petit que str2, ou une valeur positive si str2 est plus petit que str1.

Il ne faut donc pas utiliser les opérateurs >, >=, <, <=

II.3. Concaténation

On peut utiliser la méthode concat pour concaténer deux chaînes :

 
Sélectionnez

	String s3 = s1.concat(s2);

Il est également possible de faire appel a signe d'addition + pour effectuer une concaténation :

 
Sélectionnez

	String mot = message + " et " + "puis s'en vont";

II.4. Extraction de caractères

Un objet de la classe String est immuable. Une fois qu'il a été défini, sa valeur ne peut être modifiée. On peut en revanche lui attribuer une nouvelle chaîne de caractères. Si msg est défini comme suit :

 
Sélectionnez

	String msg = "Attention!";

On peut parfaitement changer son contenu :

 
Sélectionnez

	msg = "nouveau texte";

En fait, la chaîne "Attention!" est oubliée et l'objet msg pointe vers la nouvelle chaîne "nouveau texte".

On peut extraire une sous-chaîne à l'aide de la méthode substring de la classe String. Deux versions existent :

 
Sélectionnez

	public String substring(int debut, int fin)

Qui retourne un nouveau string qui débute au caractère à la position debut et va jusqu'au caractère à la position fin -1.
Par exemple, txt = msg.substring(0, 6); retourne la chaîne "nouveau".

 
Sélectionnez

	public String substring(int debut)

Qui retourne un nouveau string qui commence au caractère à la position debut et qui se termine à la fin du string initial.
Par exemple, txt = "premier" + "nouveau cas".substring(8); retourne la chaîne "premier cas".

II.5. Longueur d'une chaîne de caractères

La longueur d'une chaîne est obtenue à l'aide de la méthode length().
Par exemple, txt.length() retourne 11.

Si on a une chaîne str, la méthode str.charAt(index) retourne le caractère spécifié de la chaîne str. Le paramètre index peut avoir une valeur comprise entre 0 et str.length() - 1.

II.6. Conversions diverses

Bien que le contenu d'une chaîne ne puisse pas être modifié, il est possible d'effectuer des conversions en créant une nouvelle chaîne.

Les méthodes toLowerCase et toUpperCase permettent d'obtenir une chaîne respectivement en minuscules et en majuscules.

La méthode trim permet d'obtenir une nouvelle chaîne sans espaces au début ou à la fin.

La méthode replace(oldChar, newChar) permet de remplacer tous les caractères oldChar d'une chaîne par des caractères newChar.

II.7. Conversion de caractères et de valeurs numériques en chaînes de caractères

La classe String dispose de plusieurs méthodes valueOf permettant de convertir un caractère, un tableau de caractères et des valeurs numériques en chaînes de caractères.
Ces méthodes ont le même nom, mais se différencient par le type de paramètre qui leur est fourni (char, char[], double, long, int, float, etc.)

III. La classe StringBuffer

De manière générale un StringBuffer peut être utilisé partout où un String est utilisé. Il est simplement plus flexible : on peut modifier son contenu. Cette classe dispose de 3 constructeurs et de plus de 30 méthodes dont les plus utilisées sont les suivantes (les paramètres ne sont pas indiqués ici, on trouvera plus de détail dans l'aide de Java) :

  • append
  • capacity
  • charAt
  • delete
  • insert
  • length
  • replace
  • reverse
  • setCharAt
  • setLength
  • substring

III.1. Construction d'un StringBuffer

Les 3 manières de construire un StringBuffer sont :

 
Sélectionnez
 
	public StringBuffer()

qui construit une chaîne vide d'une capacité initiale de 16 caractères.

 
Sélectionnez
 
	public StringBuffer(int longueur)

qui construit une chaîne vide d'une capacité indiquée par longueur.

 
Sélectionnez
 
	public StringBuffer(String str)

qui construit une chaîne recevant le paramètre str. La capacité de la chaîne est 16 plus la longueur de str.

III.2. Exemples d'utilisation

La méthode append cache plusieurs méthodes du même nom permettant d'ajouter des expressions de type char, char[], double, float, int, long, et String. Exemple de construction utilisant la méthode append :

 
Sélectionnez

	StringBuffer stbuf = new StringBuffer();
	stbuf.append("Cours");
	stbuf.append(" ");
	stbuf.append("de ");
	stbuf.append("Java .");

Il en va de même pour la (les) méthode(s) insert. Voici un exemple :

 
Sélectionnez

	stbuf.insert(9, "HTML et ");

Un StringBuffer évolue dynamiquement. Si on augmente la longueur de son contenu, l'espace mémoire alloué est automatiquement augmenté.

III.3. Capacité et longueur

La méthode capacity retourne la capacité, c'est à dire le nombre de caractères qu'une StringBuffer peut recevoir.

La méthode length retourne le nombre de caractères effectivement placés dans le StringBuffer.

La méthode setLength(int newLong) permet de spécifier la longueur d'un StringBuffer.
Si la valeur du paramètre newLong est inférieure au nombre de caractères dans le StringBuffer, celui-ci est tronqué. Si la valeur de newLong est supérieure au nombre de caractères du StringBuffer, son contenu est complété par des caractères nuls ('\u0000').

IV. La classe StringTokenizer

Cette classe est utilisée pour séparer une chaîne de caractères en plusieurs morceaux.
Voyons comment la classe StringTokenizer peut reconnaître des mots. Tout d'abord, il est possible de spécifier des séparateurs lors de la construction d'un StringTokenizer. Voici les constructeurs possibles :

 
Sélectionnez

	public StringTokenizer(String s, String delim, boolean tokens)

Qui construit un StringTokenizer pour le string s avec les séparateurs indiqués par delim. Si tokens est vrai, le séparateur est retourné en tant que morceau du string.

 
Sélectionnez

	public StringTokenizer(String s, String delim)

Qui construit un StringTokenizer pour le string s avec les séparateurs indiqués par delim. Le séparateur n'est pas considéré comme un morceau du string.

 
Sélectionnez

	public StringTokenizer(String s)

Qui construit un StringTokenizer pour le string s avec les séparateurs par défaut (espace, newline, tab et return) et le séparateur est retourné en tant que morceau du string.

Voici une exemple montrant comment extraire les mots d'une phrase :

 
Sélectionnez

	String s = "Java est un langage moderne";
	StringTokenizer st = new StringTokenizer(s);
	System.out.println("Nombre de mots:" + st.countTokens());
	while (st.hasMoreTokens()) 
		System.out.println(st.nextToken());

V. Exercices

V.1. Exercice 1

Ecrire une Applet Java comportant une zone de texte et un bouton. L'utilisateur entre un mot dans la zone de texte. En cliquant sur le bouton le programme indique si le mot est un palindrome (mot qui se lit dans les deux sens). Utilisation obligatoire de la classe String.

V.2. Exercice 2

Comme l'exercice 1, mais en utilisant StringBuffer.

V.3. Exercice 3

Ecrire un programme Java (application ou applet) qui affiche le calendrier pour un mois et une année donnés sous la forme :

 
Sélectionnez

Lu  ma  me  je  ve  sa  di
     1   2   3   4   5   6
 7   8   9  10  11  12  13
14  15  16  17  18  19  20
21  22  23  24  25  26  27
28  29  30  31

V.4. Exercice 4

Ecrire une application utilisant StringTokenizer qui permet de calculer une expression entrée par l'utilisateur. Par exemple, si l'expression est :

 
Sélectionnez

12+4+3

L'application doit afficher :

 
Sélectionnez

Le résultat est 19