Essayer de coder ← Retour aux sujets

String : un objet immuable

String

Un String est un objet : ses méthodes s'appellent avec un point. Il est immuable : aucune méthode ne le modifie, elles renvoient toutes un nouveau String.

s.length()
Nombre de caractères
s.charAt(0)
Caractère d'indice 0 (de type char)
s.substring(1, 4)
De l'indice 1 inclus à l'indice 4 exclu
s.indexOf("a")
Indice de la première occurrence, ou -1
s.toUpperCase()
Nouvelle chaîne en majuscules
s.equals(t)
Les deux chaînes ont-elles le même texte ?
Exploration.java
public class Exploration {
    public static void main(String[] args) {
        String s = "Programmation";

        System.out.println(s.length());
        System.out.println(s.charAt(0));
        System.out.println(s.substring(3, 7));
        System.out.println(s.indexOf("ma"));
        System.out.println(s.toUpperCase());
    }
}
Affichage
13
P
gram
7
PROGRAMMATION

Découper, assembler, convertir

split · join

Les opérations qui servent tous les jours : nettoyer, chercher, découper une ligne, convertir un texte en nombre.

s.trim()
Retire les espaces au début et à la fin
s.replace("a", "o")
Remplace toutes les occurrences
s.contains("ion")
true si la sous-chaîne est présente
s.startsWith("Pro")
Teste le début de la chaîne
s.split(",")
Découpe en tableau de String
String.join("-", a, b)
Assemble avec un séparateur
Integer.parseInt("42")
Convertit en int
Decoupe.java
import java.util.Arrays;

public class Decoupe {
    public static void main(String[] args) {
        String ligne = "Lina,17,14.5";
        String[] champs = ligne.split(",");

        System.out.println(Arrays.toString(champs));
        int age = Integer.parseInt(champs[1]);
        double moyenne = Double.parseDouble(champs[2]);
        System.out.println(age + 1);
        System.out.println(moyenne * 2);
        System.out.println(String.join(" | ", champs));
    }
}
Affichage
[Lina, 17, 14.5]
18
29.0
Lina | 17 | 14.5

✂️ Le cours : manipuler du texte

En Java, le texte est représenté par la classe String. Contrairement au C, il n'y a ni '\0' à gérer ni tableau de caractères à dimensionner : un String connaît sa longueur et sait s'agrandir en créant de nouveaux objets. Les indices commencent à 0, comme dans les tableaux.

Un String est immuable

Aucune méthode ne modifie un String existant : toUpperCase(), replace(…), trim()… renvoient un nouveau texte. Si tu ignores ce résultat, rien ne change.

Immuable.java
public class Immuable {
    public static void main(String[] args) {
        String mot = "nsi";

        mot.toUpperCase();              // résultat ignoré : mot ne change pas
        System.out.println(mot);
        mot = mot.toUpperCase();        // on range le nouveau String dans mot
        System.out.println(mot);
    }
}
Affichage
nsi
NSI

Parcourir une chaîne

length() donne le nombre de caractères et charAt(i) le caractère d'indice i (de type char, à écrire entre apostrophes pour le comparer). Ici, on compte les voyelles.

Voyelles.java
public class Voyelles {
    public static void main(String[] args) {
        String texte = "programmation";
        int voyelles = 0;

        for (int i = 0; i < texte.length(); i++) {
            char c = texte.charAt(i);
            if ("aeiou".indexOf(c) >= 0) {
                voyelles++;
            }
        }
        System.out.println(voyelles + " voyelles");
    }
}
Affichage
5 voyelles

On peut aussi écrire for (char c : texte.toCharArray()), qui parcourt chaque caractère sans indice.

Comparer deux chaînes

equals teste l'égalité du texte, equalsIgnoreCase ignore la casse, compareTo donne l'ordre alphabétique (nombre négatif si le premier mot vient avant, 0 si égaux, positif sinon). N'utilise jamais == pour comparer du texte (voir Conditions).

Comparer.java
public class Comparer {
    public static void main(String[] args) {
        String a = "chat";
        String b = "chien";

        System.out.println(a.equals("chat"));
        System.out.println("CHAT".equalsIgnoreCase(a));
        System.out.println(a.compareTo(b) < 0);     // "chat" avant "chien"
    }
}
Affichage
true
true
true

Construire un long texte : StringBuilder

Chaque + sur un String crée un nouvel objet : dans une boucle de n tours, le coût devient quadratique. StringBuilder est un texte modifiable : append ajoute à la fin sans tout recopier, toString() donne le résultat final.

Construction.java
public class Construction {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();

        for (int i = 1; i <= 5; i++) {
            sb.append(i);
            if (i < 5) {
                sb.append(", ");
            }
        }
        System.out.println(sb.toString());
        System.out.println(new StringBuilder("NSI").reverse());
    }
}
Affichage
1, 2, 3, 4, 5
ISN

Mettre en forme avec String.format

String.format utilise les mêmes formats que printf (%d, %s, %f…) mais renvoie le texte au lieu de l'afficher. Une largeur (%6s) aligne à droite, un tiret (%-6s) aligne à gauche, %05d complète par des zéros.

Format.java
public class Format {
    public static void main(String[] args) {
        System.out.println(String.format("%05d", 42));
        System.out.println(String.format("[%-6s]", "ab"));
        System.out.println(String.format("[%6s]", "ab"));
        System.out.println("NSI".repeat(2));
    }
}
Affichage
00042
[ab    ]
[    ab]
NSINSI

Convertir entre texte et nombres

ConversionInstructionRemarque
texte → intInteger.parseInt("42")lève NumberFormatException si le texte n'est pas un entier
texte → doubleDouble.parseDouble("3.5")attend un point décimal
nombre → texteString.valueOf(42) ou "" + 42Integer.toString(42) marche aussi
char → code(int) 'A' vaut 65et (char) 66 vaut 'B'

La classe Character fournit isDigit, isLetter, isUpperCase, toUpperCase… pour tester ou transformer un seul caractère.

⚠️ Erreurs fréquentes

Ignorer le résultat d'une méthode de String

À éviter
Faux.java
nom.trim();             // nom est inchangé
Correct
Correct.java
nom = nom.trim();      // on garde le nouveau texte

Comparer avec == au lieu de equals

if (reponse == "oui") peut sembler marcher avec des littéraux, puis échouer dès que le texte vient d'une saisie. Écris reponse.equals("oui") (ou "oui".equals(reponse), qui évite une NullPointerException si reponse vaut null).

Se tromper sur les bornes de substring

s.substring(debut, fin) inclut debut et exclut fin. s.substring(0, 3) donne les trois premiers caractères. Une borne hors du texte lève une StringIndexOutOfBoundsException.

Comparer un char à un String

À éviter
Faux.java
if (mot.charAt(0) == "a") { … }   // char contre String : erreur
Correct
Correct.java
if (mot.charAt(0) == 'a') { … }   // char contre char

split avec un point ou une barre

split attend une expression régulière : le point . y signifie « n'importe quel caractère ». Pour couper sur un vrai point, écris split("\\.") ; pour une barre verticale, split("\\|").

Convertir un texte qui n'est pas un nombre

Integer.parseInt("abc") lève une NumberFormatException, et " 42" (avec une espace) aussi : applique trim() avant la conversion, et entoure-la d'un try / catch quand le texte vient de l'utilisateur (voir Exceptions).

Concaténer dans une grande boucle

Construire un texte de 100 000 caractères avec s += … recopie la chaîne à chaque tour. Utilise un StringBuilder.

📋 Aide-mémoire

  • length(), charAt(i), substring(debut, fin) (fin exclue), indexOf(x) (-1 si absent), contains, startsWith, replace, trim.
  • Un String est immuable : s = s.toUpperCase(); et non s.toUpperCase();.
  • Comparer : equals / equalsIgnoreCase / compareTo, jamais ==.
  • split(",") → tableau ; String.join(sep, …) ; Integer.parseInt / Double.parseDouble (attention aux exceptions).
  • Texte construit en boucle : StringBuilder avec append puis toString().
  • 'a' est un char, "a" est un String : on ne les mélange pas.