Aller au contenu principal

Les chaînes de caractères

Notions théoriques

String : une classe immuable

En Java, String est une classe (et non un type primitif). Les chaînes sont immuables : une fois créées, leur contenu ne peut pas changer. Toute opération qui semble "modifier" une String crée en réalité une nouvelle String.

String prenom = "Alice";
prenom = prenom.toUpperCase(); // crée une nouvelle String "ALICE"
// "Alice" existe toujours en mémoire jusqu'au nettoyage du garbage collector

Méthodes essentielles de String

String texte = " Bonjour le monde ";

texte.length() // 20 — nombre de caractères
texte.charAt(2) // 'B' — caractère à l'indice 2
texte.substring(2, 9) // "Bonjour" — de l'indice 2 (inclus) à 9 (exclu)
texte.indexOf("le") // 10 — indice de la première occurrence
texte.toUpperCase() // " BONJOUR LE MONDE "
texte.toLowerCase() // " bonjour le monde "
texte.trim() // "Bonjour le monde" — supprime les espaces aux extrémités
texte.contains("monde") // true
texte.replace("monde", "Java") // " Bonjour le Java "
texte.split(" ") // tableau ["", "", "Bonjour", "le", "monde", "", ""]

Comparaison de String

Rappel critique

Ne jamais utiliser == pour comparer le contenu de deux String. Utilise toujours .equals() ou .equalsIgnoreCase() :

String a = "Bonjour";
String b = "bonjour";

a.equals(b) // false (sensible à la casse)
a.equalsIgnoreCase(b) // true (insensible à la casse)

StringBuilder — Concaténation efficace

Quand vous devez construire une chaîne en plusieurs étapes (dans une boucle par exemple), utilisez StringBuilder plutôt que +. En effet, chaque + crée une nouvelle String, ce qui est coûteux en mémoire.

// Inefficace dans une boucle :
String resultat = "";
for (int i = 0; i < 1000; i++) {
resultat += i; // crée 1000 nouvelles String !
}

// Efficace avec StringBuilder :
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i);
}
String resultat = sb.toString();

Méthodes utiles de StringBuilder :

sb.append("texte") // ajoute à la fin
sb.insert(0, "début") // insère à une position
sb.reverse() // inverse la chaîne
sb.toString() // convertit en String
sb.length() // longueur actuelle

String.format() et printf()

Pour formater des chaînes avec des valeurs insérées :

String prenom = "Alice";
int age = 17;
double note = 15.75;

// String.format() retourne une String formatée
String msg = String.format("Bonjour %s, vous avez %d ans.", prenom, age);
// "Bonjour Alice, vous avez 17 ans."

// System.out.printf() affiche directement (comme String.format + println)
System.out.printf("Note : %.2f%n", note);
// "Note : 15.75"

Spécificateurs courants :

SpécificateurTypeExemple
%sString"Alice"
%dEntier (int, long)42
%fDécimal3.141593
%.2fDécimal, 2 décimales3.14
%nRetour à la ligne (portable)
%bBooléentrue

Exemple pratique

public class StringsDemo {

public static void main(String[] args) {
String email = " alice.dupont@lycee-joliciel.fr ";

// Nettoyage et normalisation
email = email.trim().toLowerCase();
System.out.println("Email nettoyé : " + email);

// Vérifications
System.out.println("Contient '@' ? " + email.contains("@"));
System.out.println("Longueur : " + email.length());

// Extraction de l'identifiant (avant le @)
int posArobase = email.indexOf("@");
String identifiant = email.substring(0, posArobase);
System.out.println("Identifiant : " + identifiant);

// Formatage avec printf
String prenom = "Alice";
double moyenne = 14.333333;
System.out.printf("Bulletin de %s : moyenne = %.1f%n", prenom, moyenne);

// StringBuilder pour construire un tableau de bord
StringBuilder tableau = new StringBuilder();
tableau.append("=== Tableau de bord ===\n");
String[] matieres = {"Maths", "Français", "Anglais"};
double[] notes = {14.5, 12.0, 16.0};
for (int i = 0; i < matieres.length; i++) {
tableau.append(String.format("%-10s : %.1f%n", matieres[i], notes[i]));
}
System.out.print(tableau.toString());
}
}
astuce

%-10s aligne le texte à gauche sur 10 caractères. Le - signifie "alignement à gauche", 10 est la largeur minimale. Utile pour afficher des colonnes bien alignées.

Test de mémorisation/compréhension


Pourquoi dit-on que String est 'immuable' en Java ?


Quelle méthode supprime les espaces au début et à la fin d'une String ?


Que retourne `"Bonjour".substring(0, 3)` ?


Quel spécificateur de format utilise-t-on pour afficher un double avec 2 décimales ?


Quelle classe utiliser pour construire efficacement une chaîne dans une boucle ?


Que retourne `"bonjour".toUpperCase()` ?


TP pour réfléchir et résoudre des problèmes

Vous allez créer un programme qui valide et formate des données utilisateur (nom, email, numéro de téléphone).

Étape 1 — Valider un email

Crée une méthode qui vérifie qu'un email contient le caractère @ et un point ..


Bonne pratique - Valider les entrées

Toujours valider les données saisies par l'utilisateur avant de les traiter. Une validation simple (présence de @) est un premier rempart. Pour une validation robuste, on utilise des expressions régulières (Pattern) ou une bibliothèque dédiée.

Étape 2 — Normaliser un nom

Crée une méthode qui nettoie un nom : supprime les espaces aux extrémités et met la première lettre en majuscule.


Bonne pratique - Chaîner les méthodes String

Les méthodes de String retournent toutes une nouvelle String, ce qui permet de les chaîner : nom.trim().toLowerCase().replace("-", " "). C'est lisible et évite des variables intermédiaires inutiles.

Étape 3 — Formater un affichage avec printf

Affiche un récapitulatif formaté avec System.out.printf.


Bonne pratique - printf pour les tableaux alignés

System.out.printf() avec les spécificateurs de largeur (%-20s, %10d) permet d'aligner des colonnes proprement dans la console, sans calculs manuels d'espaces. C'est beaucoup plus maintenable que la concaténation manuelle d'espaces.

📌 Une solution