La classe String en Java

08 Sep 2019 08 Sep 2019 5320 vues ESSADDOUKI Mostafa
Introduction
1 Nouveautés de Java 11 2 Différences entre JDK, JRE et JVM 3 Structure d'un programme Java - Hello World 4 Mots clés et conventions de dénomination en Java 5 Types de données intégrés en Java 6 Les variables en Java 7 Classes enveloppe - Number, Integer, Double ... 8 Lire les entrées clavier en Java
Structures de contrôle
9 Les opérateurs en Java 10 Les structures conditionnelles en Java 11 Les boucles en Java 12 Instructions de contrôle de boucle - break, continue
Chaines de caractères
13 Les chaines en Java - API String 14 Les chaines en Java - StringBuffer et StringBuilder 15 Les expressions régulières en Java
Programmation OO
16 Objets et classes en Java 17 Modificateurs d'accès Java - public, private, protected et package 18 Méthodes et surcharge des méthodes en Java 19 les constructeurs en Java 20 L'héritage en Java 21 Classes abstraites en Java 22 Interfaces et héritage multiple en Java 23 Les classes imbriquées en Java 24 Les singletons en Java 25 Classes et méthodes génériques 26 Interface fonctionnelle et expressions Lambda en Java
Tableaux et collections
27 Les tableaux en Java 28 Classe Arrays - java.util.Arrays 29 Les listes dynamiques - java.util.ArrayList 30 Les listes chaînées en Java - java.util.LinkedList 31 HashSet en Java - java.util.HashSet 32 HashMap en Java - java.util.HashMap
Gestion des fichiers
33 Comprendre les fichiers informatiques 34 Utilisation des classes Path et Files en Java 35 Lecture et écriture dans un fichier en Java 36 Fichiers à accès aléatoire en Java
Gestion d'exceptions
37 Gestion d'exceptions en Java 38 Créez vos propres classes d'exception en Java
Programmation concurrente
39 Introduction à la programmation concurrente en Java - Multi-threads 40 classe java.lang.Thread 41 Synchronisation des threads en Java

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

Définition — String En Java, toute chaîne de caractères est un objet de type String, qu'il s'agisse d'une variable ou d'un littéral. Même la chaîne "Hello, world" passée directement à println est un objet String.
Immuabilité des String Les objets 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

   
Déclaration d'une String Java
String welcome = "Hello, world";

String vide = "";

String nulle = null;

String construite = new String("Bonjour");
Littéral vs new String() Préférez toujours la forme littérale (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());
Sortie
Taille : 5
length() vs length Pour les 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
Sortie
J
a
a

2.3 Sous-chaînes — substring()

substring() Extrait une portion de la chaîne. La méthode a deux variantes : 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);
Sortie
Hel
world
Hello
Calcul de la longueur d'une sous-chaîne La longueur d'une sous-chaîne 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);
Sortie
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);
Sortie
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);
Sortie
--------------------
JavaJavaJava

3. Comparaison de chaînes

Ne jamais utiliser == pour comparer des String L'opérateur == 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
Sortie
true
false
true
0
-1
true
true

4. Chaînes vides et nulles

Chaîne vide vs null Une chaîne vide ("") 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");
Sortie
Chaîne vide (length)
Chaîne vide (equals)
Chaîne vide ou espaces (Java 11+)
Variable nulle
Ordre des vérifications Vérifiez toujours 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());
Sortie
  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
Sortie
0
20
-1
true
20

6. Formatage de la sortie

printf et String.format Java propose deux méthodes de formatage inspirées du C : 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);
Sortie
Bonjour, Mostafa. L'année prochaine tu auras 31 ans.
Salaire :   12345.68 €
Pi ≈   3.1416
Nom : Mostafa     | Âge :  30 | Salaire : 12345.68
%-10s — alignement à gauche Par défaut, les valeurs sont alignées à droite dans leur champ. Le signe - 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

Niveau : Débutant

É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 ! " :

  1. Supprimer les espaces de début et de fin avec strip().
  2. Afficher la longueur de la chaîne nettoyée.
  3. Extraire le mot "Java" avec substring() en utilisant indexOf() pour trouver sa position.
  4. Vérifier si la chaîne commence par "Bonjour".
  5. Remplacer "Java" par "Python".
  6. Afficher le résultat final en majuscules avec printf et le format "Résultat : %-30s | Longueur : %d".
Sortie attendue
Sortie
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

  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.