La classe String en Java
Prérequis
Maîtriser les types primitifs, les variables et les classes de base Java. Avoir des notions sur les objets et les méthodes d'instance.
Objectifs
Comprendre la nature immuable des objets String. Manipuler les chaînes avec les méthodes essentielles : longueur, sous-chaîne, concaténation, comparaison. Maîtriser le formatage de sortie avec printf et String.format.
1. Nature de la classe String
"Hello, world" passée directement à println est un objet String.String sont immuables : une fois créé, le contenu d'un objet String ne peut jamais être modifié. Toute opération qui semble modifier une chaîne crée en réalité un nouvel objet String.Complément — StringBuffer et StringBuilder
Pour les cas où on a besoin de modifier fréquemment une chaîne (nombreuses concaténations en boucle, par exemple), Java propose StringBuilder (non thread-safe, plus rapide) et StringBuffer (thread-safe). Ces classes permettent de modifier le contenu sans créer de nouveaux objets à chaque opération.
1.1 Créer une String
String welcome = "Hello, world";
String vide = "";
String nulle = null;
String construite = new String("Bonjour");
String s = "texte") à new String("texte"). La forme littérale utilise le String pool (cache interne de la JVM), ce qui économise de la mémoire en réutilisant les chaînes identiques.2. Opérations fondamentales sur les String
2.1 Longueur — length()
La méthode length() retourne le nombre de caractères de la chaîne.
String welcome = "Hello";
System.out.println("Taille : " + welcome.length());
Taille : 5
String, on utilise length() avec des parenthèses (c'est une méthode). Pour les tableaux, on utilise tableau.length sans parenthèses (c'est un attribut). Ne pas confondre les deux !2.2 Accès à un caractère — charAt()
La méthode charAt(int index) retourne le caractère à la position spécifiée. Les indices commencent à 0.
String mot = "Java";
System.out.println(mot.charAt(0)); // J
System.out.println(mot.charAt(1)); // a
System.out.println(mot.charAt(3)); // a
J a a
2.3 Sous-chaînes — substring()
substring(debut) extrait de debut jusqu'à la fin, et substring(debut, fin) extrait de debut inclus jusqu'à fin exclu.Exemple 1 — substring()
String welcome = "Hello, world";
String s1 = welcome.substring(0, 3);
System.out.println(s1);
String s2 = welcome.substring(7);
System.out.println(s2);
String s3 = welcome.substring(0, 5);
System.out.println(s3);
Hel world Hello
substring(a, b) est toujours b - a. Ainsi, substring(0, 3) retourne une chaîne de 3 caractères (3 - 0 = 3). Cela facilite les calculs lors des manipulations.2.4 Concaténation
Java utilise l'opérateur + pour concaténer des chaînes. Tout type non-String est automatiquement converti en chaîne lors de la concaténation.
Exemple 2 — Concaténation avec +
String welcome = "H" + "ello" + ", " + "world";
System.out.println(welcome);
int annee = 2025;
String debut = annee + " is a great year";
System.out.println(debut);
double pi = 3.14159;
System.out.println("Pi vaut environ " + pi);
Hello, world 2025 is a great year Pi vaut environ 3.14159
2.5 Jointure — String.join()
La méthode statique String.join(délimiteur, éléments…) assemble plusieurs chaînes en les séparant par un délimiteur.
String tailles = String.join(" / ", "S", "M", "L", "XL");
System.out.println(tailles);
String csv = String.join(",", "Mostafa", "Ingénieur", "Maroc");
System.out.println(csv);
S / M / L / XL Mostafa,Ingénieur,Maroc
2.6 Répétition — repeat() (Java 11+)
String ligne = "-".repeat(20);
String triple = "Java".repeat(3);
System.out.println(ligne);
System.out.println(triple);
-------------------- JavaJavaJava
3. Comparaison de chaînes
== compare les références (adresses mémoire), pas le contenu des chaînes. Il peut retourner false même pour deux chaînes ayant le même contenu si elles sont stockées à des emplacements mémoire différents.
String a = new String("Hello");
String b = new String("Hello");
System.out.println(a == b); // false (deux objets différents en mémoire)
System.out.println(a.equals(b)); // true (même contenu)
Utilisez toujours equals() pour comparer le contenu.Exemple 3 — Méthodes de comparaison
String s1 = "Hello";
String s2 = "hello";
String s3 = "Hello";
System.out.println(s1.equals(s3)); // true : même contenu
System.out.println(s1.equals(s2)); // false : sensible à la casse
System.out.println(s1.equalsIgnoreCase(s2)); // true : insensible à la casse
System.out.println(s1.compareTo(s3)); // 0 : identiques
System.out.println("Abc".compareTo("Abd")); // -1 : 'c' < 'd'
System.out.println(s1.startsWith("He")); // true
System.out.println(s1.endsWith("lo")); // true
true false true 0 -1 true true
4. Chaînes vides et nulles
"") est un objet String valide de longueur 0. Une variable nulle (null) ne référence aucun objet — appeler une méthode dessus provoque une NullPointerException.
String vide = "";
String nulle = null;
if (vide.length() == 0)
System.out.println("Chaîne vide (length)");
if (vide.equals(""))
System.out.println("Chaîne vide (equals)");
if (vide.isBlank())
System.out.println("Chaîne vide ou espaces (Java 11+)");
if (nulle == null)
System.out.println("Variable nulle");
if (nulle != null && !nulle.isEmpty())
System.out.println("Ni nulle ni vide");
Chaîne vide (length) Chaîne vide (equals) Chaîne vide ou espaces (Java 11+) Variable nulle
null avant d'appeler une méthode sur la chaîne. L'expression str != null && !str.isEmpty() est sûre car Java évalue str != null en premier grâce au court-circuit de &&. Inverser l'ordre provoquerait une NullPointerException si str est null.5. Transformations de chaînes
Exemple 4 — Méthodes de transformation
String texte = " Bonjour, Java ! ";
System.out.println(texte.toUpperCase());
System.out.println(texte.toLowerCase());
System.out.println(texte.trim());
System.out.println(texte.strip());
String remplace = texte.replace("Java", "le monde");
System.out.println(remplace);
System.out.println(" espaces ".isBlank());
System.out.println("contenu".isBlank());
BONJOUR, JAVA ! bonjour, java ! Bonjour, Java ! Bonjour, Java ! Bonjour, le monde ! true false
5.1 Recherche dans une chaîne
String phrase = "Java est un langage Java";
System.out.println(phrase.indexOf("Java")); // 0 : première occurrence
System.out.println(phrase.lastIndexOf("Java")); // 20 : dernière occurrence
System.out.println(phrase.indexOf("Python")); // -1 : non trouvé
System.out.println(phrase.contains("langage")); // true
System.out.println(phrase.indexOf("Java", 5)); // 20 : cherche à partir de l'indice 5
0 20 -1 true 20
6. Formatage de la sortie
System.out.printf() pour afficher directement une chaîne formatée, et String.format() pour créer une chaîne formatée sans l'afficher immédiatement.6.1 Spécificateurs de format
| Spécificateur | Type | Exemple | Résultat |
|---|---|---|---|
%d |
Entier décimal | printf("%d", 42) |
42 |
%f |
Nombre flottant | printf("%f", 3.14) |
3.140000 |
%.2f |
Flottant à 2 décimales | printf("%.2f", 3.14159) |
3.14 |
%s |
Chaîne de caractères | printf("%s", "Java") |
Java |
%c |
Caractère | printf("%c", 'A') |
A |
%b |
Booléen | printf("%b", true) |
true |
%8.2f |
Flottant, largeur 8, 2 décimales | printf("%8.2f", 3.14) |
3.14 |
%n |
Retour à la ligne (portable) | printf("fin%n") |
Saut de ligne |
Exemple 5 — printf et String.format
String name = "Mostafa";
int age = 30;
double salaire = 12345.678;
System.out.printf("Bonjour, %s. L'année prochaine tu auras %d ans.%n", name, age);
System.out.printf("Salaire : %10.2f €%n", salaire);
System.out.printf("Pi ≈ %8.4f%n", Math.PI);
String fiche = String.format("Nom : %-10s | Âge : %3d | Salaire : %.2f", name, age, salaire);
System.out.println(fiche);
Bonjour, Mostafa. L'année prochaine tu auras 31 ans. Salaire : 12345.68 € Pi ≈ 3.1416 Nom : Mostafa | Âge : 30 | Salaire : 12345.68
- avant la largeur force l'alignement à gauche : %-10s affiche la chaîne sur 10 caractères, complétée d'espaces à droite.7. Tableau récapitulatif de l'API String
| Méthode | Description | Exemple |
|---|---|---|
int length() |
Longueur de la chaîne | "Java".length() → 4 |
char charAt(int i) |
Caractère à l'indice i | "Java".charAt(0) → 'J' |
String substring(int a) |
Sous-chaîne de a à la fin | "Hello".substring(2) → "llo" |
String substring(int a, int b) |
Sous-chaîne de a (inclus) à b (exclu) | "Hello".substring(1,4) → "ell" |
boolean equals(Object o) |
Égalité sensible à la casse | "A".equals("a") → false |
boolean equalsIgnoreCase(String s) |
Égalité insensible à la casse | "A".equalsIgnoreCase("a") → true |
int compareTo(String s) |
Comparaison lexicographique | "A".compareTo("B") → valeur négative |
boolean isEmpty() |
Vrai si la chaîne est vide | "".isEmpty() → true |
boolean isBlank() (Java 11) |
Vrai si vide ou uniquement des espaces | " ".isBlank() → true |
boolean startsWith(String s) |
Commence par s | "Hello".startsWith("He") → true |
boolean endsWith(String s) |
Se termine par s | "Hello".endsWith("lo") → true |
boolean contains(String s) |
Contient la sous-chaîne s | "Java".contains("av") → true |
int indexOf(String s) |
Indice de la première occurrence | "Java".indexOf("a") → 1 |
int lastIndexOf(String s) |
Indice de la dernière occurrence | "Java".lastIndexOf("a") → 3 |
String replace(old, new) |
Remplace toutes les occurrences | "aa".replace("a","b") → "bb" |
String toUpperCase() |
Convertit en majuscules | "java".toUpperCase() → "JAVA" |
String toLowerCase() |
Convertit en minuscules | "JAVA".toLowerCase() → "java" |
String trim() |
Supprime les espaces de début/fin (ASCII) | " hi ".trim() → "hi" |
String strip() (Java 11) |
Supprime les espaces Unicode de début/fin | " hi ".strip() → "hi" |
String repeat(int n) (Java 11) |
Répète la chaîne n fois | "ab".repeat(3) → "ababab" |
static String join(delim, ...) |
Joint plusieurs chaînes avec un délimiteur | join("-","a","b") → "a-b" |
static String format(fmt, ...) |
Crée une chaîne formatée | format("%.2f", 3.1) → "3.10" |
8. Exercice
Analyser et transformer une chaîne
Écrire un programme Java qui réalise plusieurs analyses et transformations sur une chaîne saisie (simulée ici par une variable).
Travail demandé
Avec la chaîne " Bonjour, Java 21 ! " :
- Supprimer les espaces de début et de fin avec
strip(). - Afficher la longueur de la chaîne nettoyée.
- Extraire le mot
"Java"avecsubstring()en utilisantindexOf()pour trouver sa position. - Vérifier si la chaîne commence par
"Bonjour". - Remplacer
"Java"par"Python". - Afficher le résultat final en majuscules avec
printfet le format"Résultat : %-30s | Longueur : %d".
Chaîne nettoyée : "Bonjour, Java 21 !" Longueur : 18 Mot extrait à l'indice 9 : "Java" Commence par "Bonjour" : true Après remplacement : "Bonjour, Python 21 !" Résultat : BONJOUR, PYTHON 21 ! | Longueur : 20
public class AnalyseString {
public static void main(String[] args) {
String brute = " Bonjour, Java 21 ! ";
String nettoyee = brute.strip();
System.out.println("Chaîne nettoyée : \"" + nettoyee + "\"");
int longueur = nettoyee.length();
System.out.println("Longueur : " + longueur);
int debut = nettoyee.indexOf("Java");
String motExtrait = nettoyee.substring(debut, debut + 4);
System.out.println("Mot extrait à l'indice " + debut + " : \"" + motExtrait + "\"");
boolean commencePar = nettoyee.startsWith("Bonjour");
System.out.println("Commence par \"Bonjour\" : " + commencePar);
String modifiee = nettoyee.replace("Java", "Python");
System.out.println("Après remplacement : \"" + modifiee + "\"");
String majuscule = modifiee.toUpperCase();
System.out.printf("Résultat : %-30s | Longueur : %d%n",
majuscule, majuscule.length());
}
}
Chaîne nettoyée : "Bonjour, Java 21 !" Longueur : 18 Mot extrait à l'indice 9 : "Java" Commence par "Bonjour" : true Après remplacement : "Bonjour, Python 21 !" Résultat : BONJOUR, PYTHON 21 ! | Longueur : 20
strip()élimine les espaces Unicode de début et de fin — préférable àtrim()depuis Java 11.indexOf("Java")retourne l'indice du premier caractère de"Java"dans la chaîne — utilisé ici pour calculer dynamiquement la position sans la coder en dur.substring(debut, debut + 4)extrait exactement 4 caractères à partir dedebut.replace()retourne une nouvelle chaîne —nettoyeeest inchangée car lesStringsont immuables.%-30salignemajusculeà gauche sur 30 caractères, permettant un affichage tabulaire lisible.
L'essentiel en bref
En Java, toute chaîne est un objet immuable de type String. Les opérations qui semblent modifier une chaîne créent toujours un nouvel objet. Pour comparer le contenu, utilisez equals() et jamais ==. L'API String offre plus de 50 méthodes — les plus utilisées sont length(), charAt(), substring(), indexOf(), replace(), toUpperCase(), toLowerCase(), trim()/strip(), et les méthodes de test isEmpty(), isBlank(), startsWith(), endsWith(), contains(). Pour le formatage, printf() affiche directement et String.format() crée une chaîne formatée réutilisable.