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
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écificateur | Type | Exemple |
|---|---|---|
%s | String | "Alice" |
%d | Entier (int, long) | 42 |
%f | Décimal | 3.141593 |
%.2f | Décimal, 2 décimales | 3.14 |
%n | Retour à la ligne (portable) | |
%b | Booléen | true |
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());
}
}
%-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
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 ..
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.
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.
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.