Listes, tableaux et chaînes de caractères en Java

Apprends à stocker de nombreuses valeurs en Java et à manipuler du texte. Crée des ArrayList et des tableaux, ajoute, modifie, supprime et recherche leurs éléments, puis traite-les avec des boucles à indice et des boucles for-each pour calculer des sommes, des moyennes et des maximums. Manipule ensuite du texte avec les méthodes de String : recherche et extrais des parties, découpe des lignes en champs, compare correctement des chaînes avec equals et construis efficacement des textes plus longs avec StringBuilder.

DébutantUnité 4 sur 11 de la formation Formation : Java orienté objet : classes, collections, héritage et tests

Ce que tu vas apprendre

  1. Crée des ArrayList, ajoute, lis, remplace et supprime des éléments, vérifie le contenu d’une liste et comprends ce qui se passe lorsqu’une liste est partagée ou transmise à une méthode.
    • Crée une liste et manipule ses éléments par indice
      Importe et crée une ArrayList, ajoute des éléments, lis-les et remplace-les par leur indice, et reste dans l’intervalle des indices valides.
    • Supprime des éléments et vérifie le contenu d’une liste
      Supprime des éléments par indice ou par valeur, trouve des valeurs avec contains et indexOf, et évite les pièges liés aux listes d’Integer et au décalage des indices.
    • Partage des listes entre variables et méthodes
      Explique ce que contient une variable de liste, ce qui se passe lorsqu’une liste est affectée ou transmise à une méthode, comment copier une liste et comment comparer deux listes.
  2. Crée des tableaux, lis et écris leurs éléments, transmets-les et copie-les correctement, puis choisis entre un tableau et une ArrayList.
    • Crée des tableaux et accède à leurs éléments
      Déclare et crée des tableaux, remplis-les, lis et écris leurs éléments par indice, et identifie leur longueur, leurs valeurs par défaut et la façon de les afficher.
    • Transmets, copie et compare des tableaux, puis choisis entre tableaux et listes
      Explique les références à des tableaux, copie et compare correctement des tableaux, échange des éléments et détermine quand un tableau ou une ArrayList convient à la tâche.
  3. Parcours chaque élément avec des boucles à indice et des boucles for-each, calcule des sommes, des moyennes et des extrema, recherche des valeurs et modifie une liste sans erreur pendant son parcours.
    • Parcours des listes et des tableaux avec des boucles for et for-each
      Écris des boucles à indice et des boucles for-each sur des listes, des tableaux et les caractères d’une chaîne, et choisis la boucle adaptée à la tâche.
    • Calcule des sommes, des moyennes, des effectifs et des extrema
      Utilise des variables accumulatrices pour calculer des sommes, des moyennes, des effectifs, des maximums et des minimums, et construis une liste filtrée.
    • Recherche une valeur dans une liste ou un tableau
      Écris des recherches linéaires qui renvoient une position, une réponse par oui ou non ou toutes les correspondances, et recherche selon une condition plutôt qu’une valeur exacte.
    • Modifie une liste sans erreur pendant son parcours
      Supprime ou ajoute des éléments pendant une boucle sans en sauter ni provoquer d’exception, et choisis une méthode sûre pour le faire.
  4. Considère une chaîne comme une séquence de caractères, recherche et extrais des parties, nettoie-la et transforme des lignes de texte en données et inversement.
    • Lis les caractères d’une chaîne
      Utilise length et charAt, parcours les caractères, manipule des valeurs char, assemble du texte avec + et comprends que les chaînes ne peuvent pas être modifiées.
    • Recherche, extrais et nettoie des parties d’une chaîne
      Localise du texte avec indexOf et contains, extrais des parties avec substring, et modifie la casse, les espaces et le contenu avec replace, trim et les méthodes associées.
    • Découpe du texte et convertis du texte en nombres
      Découpe une ligne en champs avec split, convertis les champs en nombres et les nombres en texte, vérifie les parties et assemble-les à nouveau.
  5. Compare des chaînes par contenu et par ordre alphabétique, et utilise StringBuilder pour construire et modifier du texte étape par étape.
    • Compare des chaînes avec equals et compareTo
      Utilise equals et equalsIgnoreCase pour tester le contenu, évite le piège de == et les erreurs liées à null, et utilise compareTo pour ordonner des chaînes.
    • Construis et modifie du texte avec StringBuilder
      Utilise StringBuilder pour construire du texte dans une boucle et le modifier en place, convertis le résultat en String et évite les erreurs courantes avec StringBuilder.

Listes et tableaux en Java : cours

5 chapitres

1

Stocke et gère des données dans une ArrayList

Une ArrayList regroupe des valeurs liées dans une collection ordonnée, même lorsque tu ne connais pas leur nombre final. Commence par créer une liste dont le type est précisé, puis insère, remplace, supprime et trouve des éléments par indice ou par valeur. Suis ensuite ce qui se passe lorsque deux variables ou une méthode partagent cette liste, pour choisir entre modifier les données existantes et créer un résultat distinct.

1.1 Crée et modifie une ArrayList

Une ArrayList stocke des valeurs dans l’ordre. Elle grandit quand tu ajoutes un élément et rétrécit quand tu en supprimes un. Chaque élément possède un indice, à partir de 0. Importe la classe avant de l’utiliser : import java.util.ArrayList;.

Crée une liste dont le type est précisé
ArrayList<String> drinks = new ArrayList<>();
drinks.add("tea");
drinks.add("milk");

Le type indiqué entre les chevrons dans <String> précise ce que la liste stocke. Le diamant <> à droite permet à Java de déduire ce même type. La liste est d’abord vide, de taille 0 ; après ces deux appels, elle contient [tea, milk] et sa taille est 2. Afficher directement la liste montre ses éléments : System.out.println(drinks);.

Le type des éléments d’une liste doit être un type de classe. Pour les nombres, utilise une classe enveloppe : Integer pour int, Double pour double, Boolean pour boolean ou Character pour char. ArrayList<int> ne compile pas. Avec ArrayList<Integer> numbers = new ArrayList<>();, numbers.add(5) fonctionne car Java convertit automatiquement l’int en Integer. Le lire dans int n = numbers.get(0); effectue la conversion inverse.

Suis chaque changement d’indice
String old = drinks.set(0, "coffee");
drinks.add(1, "water");
String last = drinks.get(2);

set(0, "coffee") remplace le premier élément et renvoie l’ancienne valeur, donc old vaut "tea". La taille reste 2. L’insertion de "water" à l’indice 1 décale "milk" vers la droite. La liste est maintenant [coffee, water, milk] ; last vaut "milk" et la taille est 3.

TâcheAppelIndice valide
Lire un élémentget(i)De 0 à size() - 1
Remplacer un élémentset(i, value)De 0 à size() - 1
Insérer un élémentadd(i, value)De 0 à size()
Ajouter un élément à la finadd(value)Aucun indice nécessaire

L’indice supplémentaire autorisé pour l’insertion correspond à la position juste après le dernier élément actuel. Dans cette liste, add(3, "juice") ajoute l’élément à la fin, mais get(3) échouerait avant cette insertion. Un indice invalide provoque une IndexOutOfBoundsException. Utilise get(size() - 1) pour le dernier élément, après avoir vérifié que la liste n’est pas vide.

Commence avec des données ou collecte des saisies

Avec import java.util.List;, new ArrayList<>(List.of("red", "green", "blue")) crée une liste modifiable contenant ces valeurs. List.of(...) seul crée une liste non modifiable : add, set et remove provoquent une UnsupportedOperationException. Tu verras aussi List<String> names = new ArrayList<>(); ; la variable de type général List prend toujours en charge ces méthodes de liste.

Pour collecter des lignes jusqu’à une ligne vide, utilise un Scanner nommé scanner et une liste vide nommée lines :

while (true) {
    String line = scanner.nextLine();
    if (line.isEmpty()) {
        break;
    }
    lines.add(line);
}

La ligne qui arrête la saisie est vérifiée avant l’ajout : elle n’est donc pas stockée. lines.size() compte les lignes stockées. lines.isEmpty() vérifie s’il n’y en a aucune, et lines.clear() les supprime toutes quand tu dois réutiliser la liste.

Points clés

  • Les indices commencent à 0 ; le dernier élément est à size() - 1.
  • set remplace ; add avec un indice insère et décale les éléments suivants.
  • Utilise des types enveloppes comme Integer dans une ArrayList.
  • Copie List.of(...) dans une ArrayList lorsque la liste doit être modifiée.
  • clear() supprime tous les éléments ; une liste vide a une taille de 0.

1.2 Supprime des valeurs et trouve leurs positions

Supprimer un élément modifie à la fois la taille et les indices des éléments suivants. Une recherche t’indique si une valeur existe ou où elle se trouve maintenant. Distingue bien une valeur de sa position, surtout dans une liste d’entiers.

Deux sens de remove
AppelSignificationRésultat renvoyé
remove(int index)Supprimer l’élément à une positionL’élément supprimé
remove(Object value)Supprimer la première valeur égaletrue si elle est supprimée ; sinon false

Pour [coffee, water, milk], remove(0) renvoie "coffee" et laisse [water, milk]. L’ancien indice 2 de "milk" est maintenant invalide ; cette valeur est passée à l’indice 1. Un indice enregistré n’est utile que tant que les modifications n’ont pas changé les positions qu’il décrit.

Supprimer par valeur ne signifie pas supprimer toutes les correspondances. En partant de [a, b, a], remove("a") laisse [b, a]. Un deuxième appel supprime le "a" restant. Supprimer une valeur absente renvoie false et laisse la liste inchangée ; tu peux donc utiliser directement le résultat :

boolean removed = names.remove("Lena");
if (removed) {
    System.out.println("Name removed");
}
Le piège de la surcharge pour les entiers

Un argument int sélectionne la forme par indice, même lorsque la liste stocke des entiers :

ArrayList<Integer> numbers = new ArrayList<>(List.of(10, 20, 30));
int removed = numbers.remove(1);
boolean found = numbers.remove(Integer.valueOf(10));

Le premier appel supprime l’élément à l’indice 1, donc removed vaut 20 et la liste devient [10, 30]. Le deuxième appel fournit explicitement un objet Integer. Il supprime la valeur 10, donne à found la valeur true et laisse [30]. Appeler remove(10) sur la liste d’origine de trois éléments essaierait d’accéder à l’indice 10 et provoquerait une IndexOutOfBoundsException.

Choisis un résultat de recherche

Pour colors = [red, green, blue, green], contains("green") vaut true, indexOf("green") vaut 1 et lastIndexOf("green") vaut 3. contains donne une réponse par oui ou non. Les deux méthodes qui renvoient un indice donnent la première ou la dernière position correspondante. Une valeur absente produit respectivement false ou -1.

Ces méthodes utilisent equals pour comparer les éléments. Les contenus des chaînes doivent correspondre exactement, casse comprise : indexOf("Green") vaut -1 pour cette liste. Pour une recherche insensible à la casse, une boucle peut comparer chaque nom avec equalsIgnoreCase.

Une correspondance à l’indice 0 reste une correspondance. Le test indexOf(x) > 0 la manque. Si tu as besoin de la position, teste explicitement la valeur indiquant l’absence :

int index = colors.indexOf("red");
if (index != -1) {
    colors.remove(index);
}

Ici, la recherche renvoie 0, le test réussit et la suppression à l’indice 0 laisse [green, blue, green]. Pour éviter les noms en double, vérifie avant d’ajouter : if (!names.contains(name)) { names.add(name); }. Pour supprimer toutes les occurrences, tu peux répéter la suppression tant que contains vaut true ou utiliser une boucle inverse sûre. Une boucle qui avance et incrémente toujours après une suppression peut sauter un élément décalé.

Points clés

  • remove(index) renvoie un élément ; remove(value) renvoie un booléen.
  • Pour une valeur entière, utilise remove(Integer.valueOf(x)).
  • Une suppression décale les éléments suivants d’une position vers la gauche.
  • indexOf et lastIndexOf renvoient -1 pour une valeur absente ; 0 signifie que la valeur est trouvée.
  • Les recherches de chaînes sont sensibles à la casse et comparent les contenus.
  • La suppression par valeur ne supprime que la première correspondance.

1.3 Comprends les listes partagées et les copies

Une variable de liste contient une référence à un objet. Elle ne contient pas tous les éléments dans la variable elle-même. Cela explique pourquoi modifier une liste par un nom peut affecter un autre nom, et pourquoi affecter une valeur à un paramètre a un effet différent de la modification de ses éléments.

Suis les références
ArrayList<String> original = new ArrayList<>(List.of("tea"));
ArrayList<String> alias = original;
ArrayList<String> copy = new ArrayList<>(original);
alias.add("milk");
copy.add("juice");

original et alias désignent une même liste. Après l’ajout par alias, les deux montrent [tea, milk]. La copie est une liste distincte, créée avant cet ajout : elle contient donc [tea, juice]. Deux noms pour un même objet sont des alias. L’affectation copie une référence ; le constructeur de copie crée une nouvelle liste et y copie les éléments.

La liste copiée contient des références aux mêmes objets éléments. Avec les chaînes et les valeurs enveloppées, ces objets éléments ne peuvent pas changer : remplacer une case dans une liste ne modifie donc pas la case de l’autre liste. Copier une liste suffit pour permettre aux deux listes d’ajouter, de supprimer et de remplacer des éléments indépendamment.

Une méthode reçoit une copie de la référence

Java transmet les arguments par valeur. Pour une liste, cette valeur est une référence. L’appelant et le paramètre désignent initialement la même liste :

static void addBonus(ArrayList<Integer> scores, int bonus) {
    for (int i = 0; i < scores.size(); i++) {
        scores.set(i, scores.get(i) + bonus);
    }
}

Appeler addBonus(scores, 5) sur [70, 85] transforme la liste de l’appelant en [75, 90]. La méthode n’a pas besoin de renvoyer une liste car elle modifie l’objet partagé. Mais l’affectation scores = new ArrayList<>(); dans la méthode ne redirige que son paramètre local. La variable de l’appelant désigne toujours l’ancienne liste.

Un paramètre int reçoit une copie du nombre. Modifier ce paramètre ne peut pas modifier la variable int de l’appelant. Dans les deux cas, le paramètre est local ; ce qui change, c’est que sa valeur désigne ou non un objet modifiable partagé.

Renvoie de nouvelles données lorsque c’est la tâche demandée
static ArrayList<String> longWords(ArrayList<String> words, int minLength) {
    ArrayList<String> result = new ArrayList<>();
    for (String word : words) {
        if (word.length() >= minLength) {
            result.add(word);
        }
    }
    return result;
}

La méthode lit words et écrit uniquement dans result, donc l’entrée reste inchangée. Une méthode qui modifie un argument doit indiquer ce comportement, comme le fait addBonus. Une méthode qui renvoie de nouvelles données facilite la vérification de la sortie séparément de l’entrée.

Compare les contenus et gère l’absence de résultat

a == b vérifie si deux références de liste désignent le même objet. a.equals(b) vérifie que les tailles sont égales et que les éléments sont égaux dans le même ordre. Deux listes [1, 2] construites séparément ont un contenu égal mais des identités différentes ; [2, 1] n’a pas le même contenu dans l’ordre de la liste.

Une liste vide est un véritable objet de taille 0. Une boucle qui la parcourt ne s’exécute aucune fois, mais get(0) échoue car il n’existe aucun indice d’élément. null signifie qu’il n’y a aucun objet liste ; même size() provoque alors une NullPointerException. Une méthode sans correspondance peut renvoyer une liste de résultat vide, ce qui permet à son appelant de parcourir normalement le résultat.

Points clés

  • L’affectation partage une liste ; new ArrayList<>(original) crée une liste distincte.
  • Une méthode peut modifier la liste de l’appelant par une copie de la référence.
  • Réaffecter un paramètre ne redirige pas la variable de l’appelant.
  • equals pour les listes compare les contenus ordonnés ; == compare l’identité.
  • Une liste vide peut être parcourue ; null ne référence aucune liste.
2

Stocke des données de taille fixe dans des tableaux

Les tableaux attribuent à chaque valeur une case numérotée dans une structure dont la longueur reste fixe. Crée et remplis ces cases, lis leurs valeurs par défaut et affiche clairement leur contenu. Pour copier, comparer, échanger et transmettre des tableaux à des méthodes, il faut comprendre quelles variables référencent le même objet. Utilise ces notions pour choisir un tableau ou une ArrayList selon la tâche.

2.1 Crée des tableaux avec un nombre fixe de cases

Un tableau stocke un nombre fixe d’éléments d’un même type. Tu choisis sa longueur à sa création. Les éléments peuvent changer, mais pas le nombre de cases de ce tableau. Les tableaux peuvent stocker directement des valeurs primitives.

Crée et remplis des cases
int[] scores = new int[5];
scores[0] = 90;
int first = scores[0];
int[] primes = {2, 3, 5, 7, 11};

new int[5] crée cinq cases. Leurs indices sont 0, 1, 2, 3 et 4. Les crochets permettent de lire et d’écrire une case, donc first prend la valeur 90. L’initialiseur de primes crée et remplit cinq cases à la fois. Lorsqu’un tableau rempli est nécessaire dans une expression, comme un argument de méthode, utilise new int[] {2, 3, 5}.

La longueur est un champ : scores.length, sans parenthèses. Elle compte toutes les cases, y compris celles auxquelles tu n’as pas affecté de valeur toi-même. Ajouter une valeur à la case 0 ne fait pas passer la longueur de 5 à 1.

StructureNombre d’élémentsLire un élément
Tableaua.lengtha[i]
ArrayLista.size()a.get(i)
Strings.length()s.charAt(i)

Ces noms ne sont pas interchangeables. Un tableau n’a pas de méthode size(), et une chaîne nécessite des parenthèses après length.

Identifie les valeurs initiales

Les nouvelles cases d’un tableau reçoivent des valeurs par défaut. Les tableaux de types primitifs numériques commencent avec zéro : 0 pour int, 0,0 pour double. Un boolean[] commence avec false ; un char[] commence avec le caractère dont le code est zéro, écrit '\u0000'. Les tableaux de types de classe, dont String[], commencent avec des références null.

String[] words = new String[3];
words[0] = "sun";
System.out.println(words[0].length());

Ce code affiche 3 car la case 0 référence maintenant "sun". Les cases 1 et 2 contiennent encore null. Appeler words[1].length() provoque une NullPointerException : il n’y a pas encore de chaîne à cet endroit. Une case contenant null par défaut est différente d’une chaîne vide "", qui est un objet de longueur 0.

Lis la sortie et reste dans le tableau

Importe java.util.Arrays et utilise System.out.println(Arrays.toString(scores)); pour afficher [90, 0, 0, 0, 0]. Afficher directement scores montre un code de type et d’identité comme [I@1b6d3586, pas ses éléments. Le code d’identité ne constitue pas un compte rendu utile des nombres stockés.

Voici les températures d’une semaine en degrés Celsius :

double[] temps = {12.5, 14.0, 9.5, 11.0, 15.5, 13.0, 10.5};
temps[2] = 10.0;

La mesure du troisième jour passe de 9,5 à 10,0. La première mesure est temps[0] ; la dernière est temps[6], ou temps[temps.length - 1]. temps[7] est en dehors du tableau. Java provoque une ArrayIndexOutOfBoundsException pour un indice de tableau invalide. Dans une boucle à indice, utilise i < temps.length : i <= temps.length essaie d’accéder à une case supplémentaire après la dernière case valide. Un tableau de longueur nulle n’a aucun indice d’élément valide.

Points clés

  • La longueur d’un tableau est fixée à sa création.
  • Utilise a[i] pour lire ou écrire une case et a.length pour compter les cases.
  • Les nouvelles cases numériques contiennent zéro ; les nouvelles cases de type String contiennent null.
  • Arrays.toString(a) affiche le contenu.
  • Le dernier indice valide est a.length - 1.

2.2 Copie et compare des tableaux, et échange leurs éléments

Une variable de tableau contient une référence, tout comme une variable de liste. Affecter cette référence crée un autre nom pour le même tableau. Une copie distincte nécessite un nouvel objet tableau, et comparer les contenus nécessite une méthode qui vérifie les cases.

Affectation et copie
int[] a = {4, 9, 2};
int[] alias = a;
int[] copy = Arrays.copyOf(a, a.length);
alias[0] = 99;

Maintenant, a et alias montrent tous deux [99, 9, 2] ; copy montre toujours [4, 9, 2]. Arrays.copyOf(a, a.length) crée un nouveau tableau de même longueur. a.clone() peut aussi le copier. Importe java.util.Arrays pour les méthodes utilitaires.

Demander une longueur différente modifie le nouveau tableau, pas l’ancien. Arrays.copyOf(new int[] {2, 3, 5}, 4) donne [2, 3, 5, 0]. Les cases supplémentaires reçoivent des valeurs par défaut. Pour qu’une variable référence un tableau plus grand, affecte-lui la copie renvoyée. Tout alias de l’original référence toujours l’ancien tableau.

Les appels de méthode partagent l’objet
static void doubleAll(int[] values) {
    for (int i = 0; i < values.length; i++) {
        values[i] = values[i] * 2;
    }
}

Le paramètre reçoit une copie de la référence. La méthode modifie donc les cases du tableau de l’appelant. Réaffecter values à un nouveau tableau ne modifierait que le paramètre. Une méthode peut aussi renvoyer un nouveau tableau : return new int[] {values[0], values[values.length - 1]}; produit [4, 2] pour l’entrée {4, 9, 2}. Cette expression nécessite une entrée non vide car elle lit deux indices.

L’égalité de contenu est différente pour les tableaux

Pour les tableaux créés séparément a = {1, 2} et b = {1, 2}, a == b et a.equals(b) valent tous deux false : equals pour les tableaux vérifie l’identité. Arrays.equals(a, b) vaut true car les éléments correspondants sont égaux. C’est différent pour une ArrayList, dont la méthode equals compare les contenus ordonnés.

Sauvegarde une valeur avant de l’écraser

Pour échanger deux positions, conserve une ancienne valeur dans une variable temporaire :

int temp = a[0];
a[0] = a[2];
a[2] = temp;

En partant de {4, 9, 2}, la première ligne sauvegarde 4. La deuxième produit [2, 9, 2]. La troisième rétablit le 4 sauvegardé à l’indice 2, ce qui donne [2, 9, 4]. Sans temp, affecter a[2] = a[0] après la deuxième ligne recopierait 2 et ferait perdre le 4 d’origine.

Choisis une structure adaptée aux données
BesoinChoix adapté
Une case fixe pour chaque jour ou chaque moisTableau
Des valeurs primitives sans classes enveloppesTableau
Ajouter ou supprimer des éléments au fur et à mesure des saisiesArrayList

Les tableaux apparaissent aussi dans main(String[] args) et comme résultat de String.split. Pour un String[] words, new ArrayList<>(Arrays.asList(words)) crée une liste qui peut grandir. Pour un int[], crée une ArrayList<Integer> et ajoute chaque entier dans une boucle. Arrays.asList appliqué au tableau primitif traite le tableau entier comme un seul élément : il ne crée donc pas une liste de ses nombres individuels.

Points clés

  • L’affectation d’un tableau partage le même objet ; copyOf ou clone crée une copie.
  • Utilise Arrays.equals pour comparer le contenu des tableaux.
  • Une méthode peut modifier les cases d’un tableau partagé par l’intermédiaire de son paramètre.
  • Une variable temporaire conserve une valeur pendant un échange.
  • Utilise des tableaux pour un nombre fixe de cases et des ArrayList lorsque le nombre d’éléments change.
  • Convertis un tableau de valeurs primitives en une liste de valeurs enveloppées avec une boucle.
3

Traite des listes et des tableaux avec des boucles

Les boucles transforment des valeurs stockées en résultats utiles : une somme, un effectif, un extremum, une collection filtrée ou un résultat de recherche. Choisis comment parcourir les éléments selon que tu as besoin des valeurs ou des positions. Suis l’évolution de l’état de chaque boucle pour gérer les données vides, conserver la partie fractionnaire des moyennes, arrêter une recherche au bon moment et supprimer des valeurs sans manquer les éléments qui se décalent.

3.1 Choisis une boucle à indice ou une boucle for-each

Une boucle permet à un même morceau de code de traiter chaque élément. Le choix dépend de ce dont le corps de la boucle a besoin : seulement une valeur, sa position ou un moyen de modifier la collection. Les tableaux comme les ArrayList prennent en charge les boucles à indice et les boucles for-each.

Parcours les valeurs dans l’ordre
for (String task : tasks) {
    System.out.println(task);
}

Lis ceci comme « pour chaque tâche dans tasks ». Avec [shop, cook, clean], le code affiche les trois chaînes dans cet ordre. La variable de boucle a le type des éléments. Pour ArrayList<Integer>, utilise int pour convertir automatiquement chaque valeur enveloppée en valeur primitive ou Integer pour conserver la référence à l’objet enveloppe. Pour les caractères d’une chaîne, for (char c : word.toCharArray()) parcourt les valeurs char.

Une boucle for-each ne fournit pas d’indice. Si tu as besoin de lignes numérotées, utilise une boucle à indice :

for (int i = 0; i < tasks.size(); i++) {
    System.out.println((i + 1) + ". " + tasks.get(i));
}

L’indice commence à 0, mais le numéro de ligne affiché commence à 1. Les parenthèses font de i + 1 une addition avant que son résultat ne devienne une partie du texte. Pour un tableau, remplace la condition par i < tasks.length et lis tasks[i]. Une boucle while peut faire le même travail en initialisant un compteur avant la boucle et en l’incrémentant dans le corps.

Modifie une valeur par sa position
int[] nums = {4, 9, 2};
for (int n : nums) {
    n = n * 2;
}

Ce code laisse le tableau inchangé. Chaque passage place une copie d’une valeur primitive dans n ; affecter une valeur à cette variable locale ne modifie pas la case d’origine. Pour modifier le tableau :

for (int i = 0; i < nums.length; i++) {
    nums[i] = nums[i] * 2;
}

Le résultat est [8, 18, 4]. Pour une liste d’entiers, la mise à jour correspondante est list.set(i, list.get(i) * 2). L’indice indique à Java quel élément stocké remplacer.

Adapte les bornes au corps de la boucle

Pour parcourir une liste à l’envers, commence à tasks.size() - 1, continue tant que i >= 0 et utilise i--. Le parcours visite clean, cook, puis shop. Pour prendre un élément sur deux, tu peux utiliser i += 2 dans une boucle qui avance.

Les comparaisons avec un voisin nécessitent un intervalle plus court. Si le corps lit à la fois list.get(i) et list.get(i + 1), la condition est i < list.size() - 1. La dernière position de départ valide est l’avant-dernier élément. Utiliser la condition habituelle d’un parcours complet essaierait de lire un voisin inexistant après le dernier élément.

Lorsque tu traites ensemble deux listes de même longueur, utilise un indice pour accéder aux deux. Par exemple, names.get(i) et scores.get(i) désignent les entrées correspondantes. Une boucle for-each est plus simple lorsque la position ne joue aucun rôle, par exemple pour afficher chaque nom ou ajouter chaque valeur à une somme.

Commencer à 1 saute le premier élément sans avertissement. Utiliser <= size() ou <= length essaie d’accéder à un indice supplémentaire invalide. Une liste ou un tableau vide ne nécessite aucune règle particulière de parcours : la condition initiale est fausse, donc le corps ne s’exécute aucune fois. Tout code ultérieur qui divise par l’effectif ou lit un élément doit gérer lui-même ce cas vide.

Points clés

  • Une boucle for-each est utile lorsque son corps n’a besoin que de chaque valeur.
  • Utilise un indice pour écrire des valeurs stockées, suivre des positions ou comparer des voisins.
  • Affecter une valeur à une variable for-each ne remplace pas un élément de tableau ou de liste.
  • L’accès au voisin à i + 1 nécessite i < size() - 1.
  • Un parcours normal d’une collection vide ne s’exécute aucune fois.

3.2 Calcule un résultat à partir de plusieurs éléments

Un accumulateur conserve un résultat construit au fil des passages dans une boucle. Initialise-le avant la boucle, mets-le à jour à l’intérieur, puis utilise-le après. La valeur initiale dépend de la tâche : une somme ou un effectif commence à 0, tandis qu’un maximum nécessite un élément réel.

Sommes et moyennes
int sum = 0;
for (int value : numbers) {
    sum += value;
}
if (!numbers.isEmpty()) {
    double average = (double) sum / numbers.size();
    System.out.println(average);
}

Pour [4, 7, 8], sum passe de 0 à 4, puis à 11 et enfin à 19. Les deux opérandes de sum / numbers.size() seraient des entiers, ce qui donnerait 6. Effectuer un transtypage de sum avant la division donne environ 6,33. Convertir le quotient déjà calculé ne ferait que transformer le 6 tronqué en 6,0.

Une collection vide n’a pas de moyenne ordinaire. La division entière par zéro provoque une ArithmeticException ; la division en virgule flottante 0.0 / 0 donne NaN. Décide de ce que signifie le cas vide pour le programme avant de diviser, par exemple afficher « Aucune mesure ». Pour les distances décimales [5.0, 7.5, 10.0] km, une somme de type double vaut 22,5 km et la moyenne est de 7,5 km.

Compte seulement les correspondances

Un comptage conditionnel commence à 0 et ne s’incrémente que lorsque son test réussit. Pour les températures {22, 27, 31, 24, 26} en degrés Celsius, if (t > 25) { count++; } donne 3. Place l’initialisation en dehors de la boucle ; remettre count à zéro à chaque passage ferait perdre les correspondances précédentes.

Trouve un extremum et sa position

Pour un tableau non vide, commence par int max = values[0];. Remplace max chaque fois qu’une valeur parcourue est plus grande. Commencer à 0 échoue pour {-5, -2, -9} : le résultat indiqué est 0 alors qu’aucun élément n’a cette valeur. Commencer par -5 permet à la boucle de trouver le bon maximum, -2. Un minimum utilise le même schéma avec <.

Quand la position compte, conserve le meilleur indice :

int best = 0;
for (int i = 1; i < numbers.size(); i++) {
    if (numbers.get(i) > numbers.get(best)) {
        best = i;
    }
}

Pour [4, 7, 8], best vaut 2 à la fin et numbers.get(best) vaut 8. La boucle commence à 1 car l’indice 0 est déjà le candidat initial. Avec >, une valeur égale ne remplace pas le candidat actuel, ce qui conserve le premier maximum. Avec >=, chaque égalité le remplace, ce qui conserve le dernier maximum. Vérifie que la collection n’est pas vide avant de créer un candidat à l’indice 0.

Collecte les valeurs correspondantes

Le filtrage utilise une liste de résultat vide comme accumulateur. Parcours chaque mot, ajoute-le lorsque word.length() > 4 et renvoie le résultat. Pour [sun, planet, moon, galaxy], le résultat est [planet, galaxy]. Lire l’entrée et ajouter les éléments à une liste distincte laisse l’entrée inchangée.

Pour deux éléments Integer, == compare l’identité des objets. Les petites valeurs mises en cache peuvent masquer cette erreur ; des valeurs plus grandes égales peuvent être des objets différents. Compare-les avec equals ou convertis-les d’abord en valeurs primitives dans des variables int. Les opérateurs numériques <, >, <= et >= convertissent les valeurs enveloppées en valeurs primitives : le code qui cherche le meilleur indice compare donc leurs nombres.

Points clés

  • Initialise un accumulateur avant la boucle et mets-le à jour à l’intérieur.
  • Effectue un transtypage avant la division entière pour conserver la partie fractionnaire d’une moyenne.
  • Vérifie que la collection n’est pas vide avant de calculer une moyenne ou de sélectionner un extremum.
  • Initialise un maximum ou un minimum à partir d’un élément réel.
  • > conserve le premier maximum ; >= conserve le dernier.
  • Le filtrage accumule les correspondances dans une nouvelle liste.
  • Utilise l’égalité de valeur pour comparer deux objets Integer.

3.3 Recherche jusqu’à une correspondance ou jusqu’à la fin

Une recherche linéaire vérifie les éléments les uns après les autres. Elle fonctionne quel que soit l’ordre des données. Une recherche de la première correspondance peut s’arrêter dès qu’elle la trouve ; une recherche infructueuse doit atteindre la fin avant de conclure qu’aucun élément ne correspond.

Renvoie le premier indice correspondant
static int indexOfName(ArrayList<String> names, String target) {
    for (int i = 0; i < names.size(); i++) {
        if (names.get(i).equals(target)) {
            return i;
        }
    }
    return -1;
}

Si le premier nom correspondant est à l’indice 2, la méthode vérifie les indices 0, 1 et 2, puis renvoie immédiatement 2. L’instruction return -1 est après la boucle car seul un parcours achevé établit l’absence de correspondance. Placer else { return -1; } à l’intérieur arrêterait la recherche au premier élément non correspondant et ignorerait tous les candidats suivants.

La valeur -1 indiquant l’absence ne peut pas être un indice valide. L’appelant doit la vérifier avant de lire le résultat :

int index = indexOfName(names, "Ahmed");
if (index != -1) {
    System.out.println(names.get(index));
}

Le test index > 0 manquerait une correspondance valide à l’indice 0. Utiliser directement -1 dans get provoquerait une exception. Sur une liste vide, le corps de la boucle ne s’exécute jamais et la méthode renvoie correctement -1.

Adapte la comparaison à la tâche

Pour rechercher des valeurs exactes dans une liste, contains et indexOf effectuent déjà une recherche linéaire. Écris une boucle pour un tableau ou une condition comme « commence par L ». Utilise equals ou equalsIgnoreCase pour les chaînes, == pour les valeurs primitives et equals pour deux objets Integer. Un test d’identité de chaînes peut manquer des textes égaux.

Pour String[] cities = {"Oslo", "Lima", "Lagos", "Pune"}, teste cities[i].startsWith("L"). Le test échoue à l’indice 0 et réussit à l’indice 1 : le résultat pour la première correspondance est donc 1. Si la tâche demande toutes les correspondances, ne renvoie pas encore de résultat. Ajoute les indices correspondants à une liste de résultat et termine le parcours ; cela donne [1, 2]. Pour compter les correspondances, incrémente un compteur au lieu de stocker les positions.

Choisis la forme de la réponse

Une recherche dont la réponse est oui ou non peut commencer par boolean found = false;. En cas de correspondance, donne-lui la valeur true et quitte la boucle avec break. Sans cette sortie, la réponse finale reste vraie mais le programme vérifie des valeurs dont il n’a plus besoin. Une méthode de recherche peut aussi renvoyer immédiatement true et renvoyer false après la boucle.

Renvoyer un élément nécessite un résultat distinct pour « rien trouvé ». Pour une String, il s’agit souvent de null ; l’appelant doit le vérifier avant d’appeler une méthode de String. Renvoyer un indice avec -1 rend le cas d’absence visible sans prétendre qu’une chaîne vide est une donnée absente.

Compte le travail réellement effectué par la recherche

Une valeur recherchée à la première position nécessite une comparaison. À la troisième position, elle en nécessite trois. Une valeur absente parmi 10 000 noms nécessite les 10 000 comparaisons. La première comparaison infructueuse ne permet pas d’établir que la valeur recherchée est absente des positions restantes. Une recherche de toutes les correspondances vérifie aussi chaque élément, même après une correspondance précoce, car des valeurs ultérieures peuvent également correspondre.

Points clés

  • La recherche linéaire parcourt les éléments dans l’ordre et fonctionne quel que soit l’ordre des données en entrée.
  • Renvoie un indice à la première correspondance ; ne renvoie -1 qu’après la boucle.
  • Utilise la comparaison adaptée au type des éléments.
  • Une recherche de toutes les correspondances poursuit le parcours après une correspondance.
  • Vérifie la valeur indiquant l’absence avant d’utiliser le résultat de la recherche.

3.4 Supprime des éléments sans en sauter

Supprimer des éléments d’une ArrayList modifie les positions que la boucle cherche à parcourir. La méthode sûre dépend de ton objectif : modifier la liste d’origine ou construire un résultat distinct. Remplacer des valeurs est plus simple car les positions restent en place.

Observe comment une boucle qui avance saute une valeur

Supposons qu’une boucle supprime les nombres pairs de [3, 8, 8, 5] et incrémente toujours i. À l’indice 1, elle supprime le premier 8. Le deuxième 8 glisse à l’indice 1, mais le passage suivant utilise l’indice 2. Le résultat est [3, 8, 5] : il reste un nombre pair. La condition était correcte ; c’est le déplacement après la suppression qui a posé problème.

Une boucle for-each sur une ArrayList ne doit pas non plus ajouter ou supprimer des éléments par l’intermédiaire de la liste. Elle utilise un itérateur dont l’état de parcours ne correspond plus à la liste modifiée. Java signale généralement une ConcurrentModificationException. Certaines modifications peuvent au contraire terminer la boucle sans avertissement et laisser un élément non parcouru. L’absence d’exception ne rend pas cette modification sûre.

Supprime à l’envers pour garder stables les positions non vérifiées
for (int i = numbers.size() - 1; i >= 0; i--) {
    if (numbers.get(i) % 2 == 0) {
        numbers.remove(i);
    }
}

Pour [3, 8, 8, 5], l’indice 3 contient 5 et reste inchangé. L’indice 2 contient 8, qui est supprimé. L’indice 1 contient toujours l’autre 8, qui est supprimé ensuite. L’indice 0 contient 3 et reste inchangé. Le résultat est [3, 5]. Une suppression décale les éléments à droite de l’indice actuel, que cette boucle inverse a déjà vérifiés.

Construis la liste des valeurs à conserver

Lorsque l’original doit rester inchangé, crée une nouvelle liste :

ArrayList<Integer> odds = new ArrayList<>();
for (int value : numbers) {
    if (value % 2 != 0) {
        odds.add(value);
    }
}

Cette boucle for-each est sûre car elle lit numbers et ajoute à une autre liste. Avec [3, 8, 8, 5] en entrée, odds contient [3, 5] et l’entrée contient toujours les quatre valeurs. Un tableau ne peut pas non plus rétrécir ; filtrer ses valeurs nécessite également un nouveau tableau ou une nouvelle liste.

Laisse un itérateur gérer sa propre suppression
Iterator<Integer> it = numbers.iterator();
while (it.hasNext()) {
    if (it.next() % 2 == 0) {
        it.remove();
    }
}

Importe java.util.Iterator. next() fournit l’élément suivant et it.remove() supprime l’élément qui vient d’être renvoyé tout en gardant cohérente la position de l’itérateur. Ne remplace pas cet appel par numbers.remove(...) dans cette boucle.

Une boucle while qui avance peut aussi fonctionner en incrémentant seulement lorsqu’aucun élément n’a été supprimé. Après une suppression, elle doit examiner à nouveau le même indice, où l’élément suivant est arrivé. Cela demande plus d’attention qu’une boucle inverse ou une nouvelle liste de résultat.

Les remplacements et les ajouts ont des effets différents

set(i, value) est sûr dans une boucle à indice car il ne change ni la taille ni les positions. Ajouter un élément à chaque passage tout en testant i < list.size() peut repousser indéfiniment la fin. Enregistre int originalSize = list.size(); et limite la boucle à cette borne lorsque chaque élément d’origine doit entraîner l’ajout d’une valeur.

Points clés

  • Une suppression dans un parcours qui avance, suivie de i++, saute l’élément décalé à la place de l’élément supprimé.
  • Une boucle inverse permet de supprimer par indice sans erreur.
  • Filtrer dans une autre liste préserve l’originale.
  • Pendant le parcours avec un itérateur, utilise sa propre méthode remove.
  • Un parcours for-each ne doit pas ajouter ou supprimer des éléments par l’intermédiaire de sa liste source.
  • Limite les boucles d’ajout à la taille d’origine lorsqu’elles ne traitent que les éléments d’origine.
4

Manipule du texte avec les méthodes de String

Le texte arrive sous forme de caractères, mais un programme a souvent besoin de noms, de nombres ou de certaines parties d’une ligne. Lis les positions avec les méthodes de String, trouve un séparateur avant de découper le texte et transforme les champs séparés en valeurs utilisables dans des calculs. Suis les résultats renvoyés : les chaînes sont immuables, et nettoyer une chaîne n’aide le code ultérieur que si ce code utilise le texte nettoyé.

4.1 Lis les caractères et conserve les résultats des méthodes de String

Une String stocke du texte sous forme de séquence de valeurs char. Les indices commencent à 0, comme pour les tableaux et les listes. Un objet String ne peut pas changer après sa création : les méthodes qui produisent un texte modifié renvoient donc un résultat que tu dois conserver.

Un caractère est différent d’une chaîne

"Hello".length() vaut 5. "Hello".charAt(0) vaut 'H' et charAt(4) vaut 'o'. Un char utilise des apostrophes et contient une unité de code UTF-16 ; une String utilise des guillemets doubles et peut contenir zéro, une ou plusieurs de ces unités. "Java".charAt(0) == 'J' compare deux caractères primitifs. Comparer ce char avec "J" ne compile pas car les types diffèrent.

charAt(length()) dépasse la fin et provoque une StringIndexOutOfBoundsException. Même charAt(0) échoue pour "". Vérifie isEmpty() avant de lire le premier caractère d’une saisie.

length() compte les valeurs char UTF-16, qui ne correspondent pas toujours à des symboles affichés entiers. "café".length() vaut 4 ; "Hi 👋".length() vaut 5 car l’émoji de la main qui salue occupe deux positions char. Utilise ce décompte pour raisonner sur les indices de ces méthodes.

Parcours et teste les caractères
String text = "Programming in Java".toLowerCase();
int vowels = 0;
for (int i = 0; i < text.length(); i++) {
    char c = text.charAt(i);
    if ("aeiou".indexOf(c) >= 0) {
        vowels++;
    }
}

La conversion en minuscules permet au même test d’appartenance de reconnaître les voyelles majuscules et minuscules. Chaque indexOf(c) est positif ou nul lorsque le caractère apparaît dans "aeiou". Le compte atteint 6 : o, a, i, i, a, a. for (char c : text.toCharArray()) peut parcourir les mêmes valeurs sans indice.

La classe Character fournit des tests comme isLetter, isDigit, isWhitespace et isUpperCase. Character.isDigit('7') vaut true, tandis que Character.isLetter('7') vaut false. Character.toUpperCase(c) et toLowerCase(c) renvoient des valeurs char converties.

Les caractères ont aussi des codes numériques. 'a' + 1 produit l’int 98 ; (char) ('a' + 1) convertit ce code en 'b'. Pour un caractère représentant un chiffre ASCII, soustraire '0' donne sa valeur : '7' - '0' vaut 7. Soustraire le code de zéro fonctionne car les codes de ces chiffres sont consécutifs.

Lis la concaténation de gauche à droite
ExpressionRésultat
"Total: " + 3 + 4"Total: 34"
3 + 4 + " items""7 items"
"Total: " + (3 + 4)"Total: 7"

Dès que le côté gauche de + est du texte, le nombre suivant est assemblé comme du texte. Les parenthèses imposent l’addition numérique avant l’assemblage. Pour quelques assemblages dans une expression, + est une solution claire.

Enregistre le texte renvoyé
String name = "Lena";
name.toUpperCase();
System.out.println(name);
name = name.toUpperCase();

L’affichage montre toujours "Lena" : l’appel dont le résultat a été ignoré n’a pas modifié son objet. L’affectation fait ensuite référencer "LENA" par name. L’immuabilité des chaînes signifie que l’ancien texte reste inchangé même si d’autres variables le référencent. Conserver le résultat et modifier l’objet d’origine sont deux opérations différentes.

Points clés

  • charAt(i) renvoie un char ; les indices valides vont jusqu’à length() - 1.
  • Les char utilisent des apostrophes ; les chaînes utilisent des guillemets doubles.
  • La longueur d’une String compte les valeurs char UTF-16, donc certains symboles occupent deux positions.
  • Les méthodes de Character testent et convertissent des valeurs char individuelles.
  • L’assemblage de chaînes avec + s’effectue de gauche à droite.
  • Stocke le résultat d’une transformation de String.

4.2 Recherche et extrais des parties de texte

Le traitement de texte suit souvent une courte séquence : trouver un repère, vérifier qu’il existe, puis extraire la partie nécessaire. Des opérations de nettoyage peuvent préparer le texte avant une recherche ou une comparaison. Chaque opération sur une String renvoie un résultat sans modifier son objet d’origine.

Trouve des positions ou pose une question à réponse oui ou non

Pour "banana", indexOf('a') renvoie 1, indexOf("a", 2) renvoie 3 et lastIndexOf('a') renvoie 5. Le deuxième argument choisit où commence la recherche vers l’avant. Une recherche infructueuse donne -1, comme dans indexOf("x").

Utilise contains(text) lorsque tu as seulement besoin de savoir si un texte apparaît. startsWith(prefix) vérifie le début et endsWith(suffix) la fin. "report.pdf".endsWith(".pdf") vaut true. Ces recherches sont sensibles à la casse : "Hello".contains("hello") vaut false. Les méthodes de recherche d’indice acceptent un char ou une String ; contains prend du texte.

Une sous-chaîne s’arrête juste avant son indice de fin
String word = "programming";
String middle = word.substring(3, 7);
String tail = word.substring(3);

middle vaut "gram", avec les positions 3, 4, 5 et 6. Sa longueur est 7 - 3, soit 4. tail vaut "gramming", car omettre l’argument de fin permet d’aller jusqu’à la fin de la chaîne. Le début doit être positif ou nul et ne pas dépasser la fin ; la fin ne peut pas dépasser length(). Des bornes invalides provoquent une StringIndexOutOfBoundsException.

Pour une adresse électronique, trouve le séparateur avant l’extraction :

String email = "lena.ito@example.com";
int at = email.indexOf("@");
if (at != -1) {
    String user = email.substring(0, at);
    String domain = email.substring(at + 1);
}

Le séparateur est à l’indice 8. La première extraction se termine avant lui et donne "lena.ito" ; la seconde commence après lui et donne "example.com". Si le repère est absent, at vaut -1. Appeler substring(0, at) sans vérification échouerait. Commencer la seconde extraction à at conserverait le @ dans le domaine.

Nettoie seulement ce que l’opération vise
MéthodeEffet
toUpperCase() / toLowerCase()Renvoyer le texte avec une casse modifiée
trim()Supprimer au début et à la fin les caractères dont le code va jusqu’à U+0020
strip()Supprimer au début et à la fin les caractères blancs reconnus par Character.isWhitespace
replace(target, replacement)Remplacer chaque occurrence littérale
repeat(n)Assembler n copies du texte

" hello ".trim() donne "hello" ; les espaces intérieurs restent. strip() traite des caractères blancs Unicode supplémentaires comme le cadratin. Cette méthode utilise la définition des caractères blancs de Java, qui n’inclut pas tous les caractères ressemblant à un espace. "banana".replace('a', 'o') donne "bonono". "ab".repeat(3) donne "ababab".

Vide et blanc sont différents

isEmpty() teste si la longueur est 0. isBlank() accepte aussi un texte composé uniquement de caractères blancs au sens de Java. Pour " ", la première méthode renvoie false et la seconde true. Utilise le test adapté à la règle de saisie. Pour nettoyer une réponse comme " Yes ", answer.trim().toLowerCase() renvoie "yes". Stocke ce texte renvoyé si la variable doit conserver la valeur nettoyée ; un simple answer.trim(); l’ignore.

Points clés

  • Les recherches de position renvoient -1 lorsqu’un repère est absent.
  • substring(begin, end) inclut begin et exclut end.
  • Vérifie une position trouvée avant de l’utiliser comme borne d’extraction.
  • replace remplace du texte littéral ; trim et strip agissent aux extrémités.
  • isBlank accepte un texte composé uniquement de caractères blancs, tandis que isEmpty nécessite une longueur de 0.

4.3 Transforme une ligne de texte en champs utilisables

Une ligne de données peut contenir plusieurs valeurs séparées par une virgule ou un autre repère. Le découpage produit un tableau de chaînes ; l’analyse syntaxique convertit ensuite certains champs en nombres. Vérifie la structure des données avant d’utiliser leurs positions.

Découpe en un tableau
String[] fields = "Ada,36,London".split(",");

Il y a trois champs : "Ada", "36" et "London". Les virgules ne sont pas conservées. fields.length vaut 3 et fields[1] est toujours du texte, pas un nombre.

Le séparateur transmis à split est une expression régulière, un motif qui n’est pas toujours du texte littéral. Une virgule représente une virgule, mais ., |, *, + et ? ont des significations particulières. Pour découper une chaîne de version sur des points littéraux, utilise "1.5.2".split("\\."). Deux barres obliques inverses dans la chaîne Java produisent l’unique barre oblique inverse du motif qui rend le point littéral. split("."), au contraire, correspond à des caractères individuels et produit un tableau vide dans cet exemple.

Gère les espaces et les parties vides

Découper "a b" sur " " produit trois parties : "a", "" et "b". Chaque séparateur est un espace, donc des espaces adjacents laissent une partie vide entre eux. Pour des suites de caractères blancs, utilise :

String[] words = "  red   green blue ".trim().split("\\s+");

Le résultat est [red, green, blue]. Nettoyer d’abord avec trim évite une première partie vide due à un séparateur initial. Par défaut, split supprime les parties vides finales : "a,b,,".split(",") ne donne que "a" et "b". Compte les champs réellement obtenus avant d’accéder à leurs indices.

Convertis chaque champ dans le type voulu

Integer.parseInt("42") renvoie l’int primitif 42. Integer.valueOf("-7") renvoie un objet Integer. Double.parseDouble("5.2") renvoie 5,2, en utilisant un point comme séparateur décimal quels que soient les paramètres régionaux de l’ordinateur. L’analyse d’un entier accepte du texte représentant un entier sans point décimal. Integer.parseInt("4.5") échoue au lieu d’arrondir.

Nettoie les champs avec trim avant leur analyse, surtout le texte représentant un entier : Integer.parseInt(" 42") provoque une NumberFormatException. Le découpage sur les virgules ne supprime pas les espaces autour des champs. Un nombre de champs correct ne garantit pas non plus qu’un champ contient un nombre valide.

Lis un enregistrement complet
String line = "Amira,10.5,63";
String[] parts = line.split(",");
if (parts.length == 3) {
    String name = parts[0].trim();
    double distanceKm = Double.parseDouble(parts[1].trim());
    int minutes = Integer.parseInt(parts[2].trim());
    double pace = minutes / distanceKm;
    System.out.println(name + ": " + pace + " min/km");
}

La distance est de 10,5 km, le temps est de 63 minutes et l’allure est de 6,0 min/km. La ligne incomplète "Amira,10.5" ne contient que deux champs ; sans la vérification du nombre de champs, parts[2] provoquerait une ArrayIndexOutOfBoundsException. Un programme peut ignorer ou signaler cet enregistrement incomplet avant d’utiliser une position manquante.

Convertis ou assemble à nouveau du texte

String.valueOf(42) et Integer.toString(42) donnent tous deux "42". String.join(", ", List.of("Oslo", "Lima", "Pune")) donne "Oslo, Lima, Pune", en insérant des séparateurs uniquement entre les parties. La méthode accepte une liste, un tableau ou des chaînes transmises en arguments séparés. L’assemblage ne fait ni analyse syntaxique ni calcul : il combine les chaînes fournies.

Points clés

  • split renvoie un tableau de String et traite son séparateur comme un motif.
  • Échappe un point littéral sous la forme "\." dans le code Java.
  • Utilise trim avant de découper sur des suites de caractères blancs et avant de convertir des champs entiers.
  • Par défaut, split supprime les champs vides finaux.
  • Vérifie le nombre de champs et le texte numérique avant d’utiliser les données converties.
  • Utilise String.join pour les parties de texte et les méthodes d’analyse syntaxique pour les nombres.
5

Compare correctement des chaînes et construis du texte efficacement

Des textes qui semblent égaux peuvent appartenir à des objets String différents. Choisis une comparaison adaptée à la tâche : égalité de contenu, égalité sans tenir compte de la casse ou ordre des caractères de Java. Construis et modifie ensuite des textes plus longs avec StringBuilder. Suivre les références et les valeurs renvoyées t’aide à prévoir si une opération modifie un texte existant, crée un résultat ou compare simplement deux objets.

5.1 Compare le contenu et l’ordre des chaînes

Deux variables peuvent contenir du texte avec les mêmes caractères sans référencer le même objet String. Choisis une comparaison selon la question posée : égalité des contenus, égalité des contenus sans tenir compte de la casse, ou texte qui vient en premier dans l’ordre de Java.

Utilise equals pour les contenus
String answer = new String("yes");
System.out.println(answer == "yes");
System.out.println(answer.equals("yes"));

Le premier résultat est false : l’objet créé séparément n’est pas celui du littéral. Le second est true car les caractères correspondent. Des littéraux identiques comme dans "yes" == "yes" partagent un objet et peuvent donner l’impression que la comparaison d’identité est fiable. Un texte obtenu à l’exécution peut utiliser des objets nouveaux ou existants : l’identité ne permet donc pas de tester si une saisie correspond.

equalsIgnoreCase ignore la casse des lettres : "YES".equalsIgnoreCase("yes") vaut true. La méthode ne supprime pas les espaces. Pour accepter aussi les espaces autour de la saisie, nettoie-la avant la comparaison.

Pour une variable qui peut valoir null, appelle la méthode sur un littéral connu qui n’est pas null : "yes".equals(answer) renvoie false pour null. answer.equals("yes") provoque une NullPointerException si answer vaut null, car aucun objet ne reçoit l’appel.

Une boucle de commande peut tester !command.equals("quit"). Le ! inverse le résultat de l’égalité de contenu. command != "quit" teste les références et peut maintenir une boucle en cours même lorsque les caractères saisis sont « quit ».

Interprète le signe de compareTo

a.compareTo(b) compare les valeurs char UTF-16 dans l’ordre. La méthode renvoie un nombre négatif si a vient avant b, zéro si les chaînes sont égales et un nombre positif si la première vient après. Seul le signe compte pour l’ordre ; le résultat n’est pas nécessairement exactement -1 ou 1.

ComparaisonSigneRaison
"apple".compareTo("banana")NégatifLe premier char différent vient avant
"pear".compareTo("pear")ZéroTous les caractères correspondent
"car".compareTo("carpet")NégatifPréfixe égal, chaîne plus courte en premier
"10".compareTo("9")Négatif'1' vient avant '9'

Les nombres stockés sous forme de texte ne suivent donc pas l’ordre numérique. Convertis-les lorsque la tâche porte sur des nombres. Les lettres majuscules anglaises non accentuées précèdent les minuscules non accentuées, donc "Zebra" vient avant "apple". Dans cet ordre, "Émile", avec sa lettre accentuée, vient après "Zoe". compareToIgnoreCase ignore la casse ; un classement selon les règles d’un dictionnaire propre à une langue nécessite java.text.Collator.

Réutilise le schéma du minimum pour les noms

Pour une liste non vide [Mia, Ahmed, Lucia] :

String first = names.get(0);
for (String name : names) {
    if (name.compareTo(first) < 0) {
        first = name;
    }
}

"Mia" est le candidat initial. "Ahmed" vient avant et devient le candidat ; "Lucia" ne le remplace pas. Le résultat est "Ahmed". Vérifie que la liste n’est pas vide avant de lire son premier élément.

Un char individuel est une valeur primitive, donc word.charAt(0) == 'A' est une comparaison correcte de caractères une fois que l’on sait que le mot n’est pas vide. Le problème avec == concerne l’identité des objets, pas toutes les comparaisons impliquant du texte.

Points clés

  • Utilise equals pour le contenu des String et equalsIgnoreCase pour ignorer la casse.
  • Un littéral connu peut recevoir un appel à equals sans erreur lorsque l’argument peut valoir null.
  • == vérifie l’identité des String, même lorsque le partage des littéraux masque l’erreur.
  • Lis seulement le signe de compareTo.
  • L’ordre des chaînes en Java est l’ordre UTF-16, et non l’ordre numérique ou celui d’un dictionnaire propre à une langue.

5.2 Construis et modifie du texte avec StringBuilder

Un StringBuilder contient du texte modifiable. Il est utile lorsqu’une boucle ajoute de nombreux morceaux ou lorsque des caractères doivent être modifiés en place. Pour quelques assemblages dans une expression, + est clair, mais reconstruire sans cesse une String qui grandit peut copier son contenu accumulé de nombreuses fois.

Ajoute des morceaux et termine par une String
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 5; i++) {
    if (i > 1) {
        sb.append(", ");
    }
    sb.append(i);
}
String result = sb.toString();

Aucune importation n’est nécessaire. append ajoute des chaînes, des char, des nombres ou des booléens à la fin. Le premier passage ajoute seulement 1 ; le deuxième ajoute ", " puis 2. Le résultat est "1, 2, 3, 4, 5". Placer un séparateur après chaque nombre laisserait un séparateur indésirable à la fin. Pour une liste de chaînes existante, String.join(", ", list) gère directement les séparateurs.

Répéter text += piece dans une boucle crée de nouveaux résultats String immuables. Le préfixe accumulé doit être inclus chaque fois, donc la quantité copiée peut croître de façon quadratique à mesure qu’un long résultat grandit. Un constructeur de chaîne conserve un tampon modifiable et y ajoute des éléments sans reconstruire tout le préfixe à chaque passage.

Modifie des positions et des portions
MéthodeEffet
insert(i, x)Insérer à la position i
delete(start, end)Supprimer une portion, end exclu
deleteCharAt(i)Supprimer un char
setCharAt(i, c)Remplacer un char
replace(start, end, text)Remplacer une portion, end exclu
reverse()Inverser l’ordre du constructeur de chaîne

length() et charAt(i) lisent le constructeur comme une String. Les indices décrivent son état actuel ; une insertion ou une suppression peut modifier les positions suivantes.

Commence par new StringBuilder("Jva"). insert(1, 'a') produit "Java" ; setCharAt(0, 'j') donne ensuite "java". Pour "2026-10-22", delete(4, 7) supprime les positions 4, 5 et 6, ce qui laisse "2026-22". Remplacer les positions 7 à 9 de "I like tea" par "coffee" donne "I like coffee".

Ne chaîne que les méthodes qui renvoient le constructeur

new StringBuilder().append("a").append(1).append('b').toString() donne "a1b". Les appels à append renvoient le même constructeur, ce qui permet un autre appel. Les méthodes de modification présentées ici renvoient aussi le constructeur, sauf setCharAt, qui renvoie void et nécessite une instruction distincte.

reverse() modifie l’objet receveur. Si sb contient "stressed", alors String r = sb.reverse().toString(); laisse à la fois r et le texte du constructeur avec la valeur "desserts". Pour préserver le constructeur d’origine, inverse un nouveau constructeur créé à partir de son texte.

Compare les contenus finaux

Pour vérifier un palindrome, ajoute la forme minuscule de chaque lettre de "Was it a car or a cat I saw". Le texte nettoyé est "wasitacaroracatisaw". Inverse un nouveau constructeur contenant ce texte, convertis-le en String et compare avec clean.equals(reversed). La comparaison vaut true.

StringBuilder ne redéfinit pas equals pour comparer les contenus. Des constructeurs distincts contenant "abc" ne sont pas égaux selon cette méthode, et un constructeur n’est pas égal à une String. Convertis-les d’abord : sb1.toString().equals(sb2.toString()) compare le texte réel.

Points clés

  • Utilise append pour construire un long résultat et toString pour le terminer.
  • Place les séparateurs entre les valeurs pour éviter un séparateur final supplémentaire.
  • Les modifications agissent sur le constructeur existant ; les fins des portions sont exclues.
  • setCharAt renvoie void et ne peut donc pas être chaînée.
  • reverse modifie le constructeur sur lequel tu l’appelles.
  • Convertis les constructeurs en String avant de comparer leurs contenus.

Listes et tableaux en Java : exemples

5 Leçons Interactives

1

Construis et partage une liste de lecture

13 étapes
Crée une liste, suis les changements de ses positions et détermine quelles modifications sont partagées par une autre variable.
  1. 1
    IntroductionSuis l’évolution d’une liste de lecture

    Une liste de lecture peut commencer vide et grandir au fil des suggestions. Tu vas ajouter des titres, corriger une entrée, supprimer un doublon et transmettre la liste à une méthode. Garde deux questions distinctes en suivant le code : quel élément occupe chaque indice à présent, et quelles variables référencent le même objet liste ? La première explique les changements de position ; la seconde explique les modifications partagées.

  2. 2
    ExplicationCrée la collection vide

    Importe java.util.ArrayList, puis crée la liste :

    ArrayList<String> reading = new ArrayList<>();
    reading.add("Orbit");
    reading.add("River");
    

    Le type des éléments est String. La liste vide atteint la taille 2 et contient [Orbit, River]. L’indice 0 désigne Orbit et l’indice 1 désigne River. Le diamant <> permet à Java de déduire le type des éléments à partir du côté gauche.

  3. 3
    ExempleInsère un titre avant un titre stocké

    Continue avec la même liste :

    reading.add(1, "Cloud");
    String old = reading.set(2, "Forest");
    

    L’insertion décale River de l’indice 1 à l’indice 2, ce qui donne [Orbit, Cloud, River]. Le remplacement place ensuite Forest à l’indice 2 et renvoie River dans old. La liste finale est [Orbit, Cloud, Forest]. Contrairement à l’insertion, le remplacement n’a pas changé la taille.

  4. 4
    DéfiTrouve la position valide suivante

    La liste est [Orbit, Cloud, Forest]. Que se passe-t-il si tu appelles reading.add(3, "Dune") ? Que renverrait ensuite reading.get(3) ?

    ---reveal---

    L’insertion ajoute Dune à la fin car l’indice size() est autorisé pour une insertion. La taille devient 4, donc l’indice 3 est maintenant valide en lecture et renvoie "Dune". Lire l’indice 3 avant l’insertion aurait échoué.

  5. 5
    ExplicationSupprime une valeur et suis le décalage

    Ajoute un autre Cloud, puis supprime par valeur :

    reading.add("Cloud");
    boolean removed = reading.remove("Cloud");
    

    La liste avant suppression est [Orbit, Cloud, Forest, Dune, Cloud]. Seul le premier Cloud est supprimé : le résultat est donc [Orbit, Forest, Dune, Cloud] et removed vaut true. Forest et tous les éléments suivants se décalent d’une position vers la gauche. Le dernier Cloud reste dans la liste.

  6. 6
    ConseilCherche si un titre existe ou où il se trouve

    Pour [Orbit, Forest, Dune, Cloud], contains("Orbit") vaut true et indexOf("Orbit") vaut 0. Un test de présence doit accepter l’indice 0 : utilise index != -1 après avoir enregistré le résultat de la recherche. Un titre absent donne -1. Les recherches comparent le contenu des String en tenant compte de la casse, donc rechercher "orbit" ne trouve pas "Orbit". Utilise lastIndexOf lorsque la dernière position correspondante compte.

  7. 7
    DéfiSupprime un nombre par sa valeur

    Une ArrayList<Integer> distincte contient [9, 1, 9]. Tu veux supprimer la première valeur 9. Quel appel convient et que reste-t-il ?

    ---reveal---

    numbers.remove(Integer.valueOf(9)) sélectionne la suppression par valeur et laisse [1, 9]. remove(9) sélectionnerait l’indice 9, qui est invalide. Le type primitif int sélectionne un indice même si la liste elle-même stocke des entiers.

  8. 8
    AnalogieDeux noms pour un seul carnet

    Imagine une référence comme une note indiquant où se trouve un carnet. Copier la note ne crée pas un autre carnet. Avec ArrayList<String> shared = reading;, les deux variables désignent une même liste, donc shared.add("Coast") est visible par reading. Un constructeur de copie, new ArrayList<>(reading), crée au contraire une autre liste avec ses propres cases.

  9. 9
    ExempleCopie avant de modifier

    Pars de [Orbit, Forest, Dune, Cloud] :

    ArrayList<String> copy = new ArrayList<>(reading);
    copy.remove("Dune");
    

    La copie devient [Orbit, Forest, Cloud], tandis que reading reste inchangée. Les deux listes référençaient initialement les mêmes éléments String immuables, mais leurs cases sont distinctes. Supprimer une case de l’une ne la supprime pas de l’autre.

  10. 10
    Point cléUn paramètre est un autre nom local

    Une méthode reçoit une copie d’une référence de liste. Appeler titles.clear() par l’intermédiaire de ce paramètre modifie la liste partagée. L’affectation titles = new ArrayList<>(); ne modifie que le nom local, donc l’appelant conserve son ancienne liste. Une liste vide est toujours un objet ; null ne désigne aucun objet. Appeler size() sur une liste vide renvoie 0, tandis qu’un appel par une référence nulle échoue.

  11. 11
    DéfiDistingue les modifications partagées de la réaffectation locale

    La liste d’un appelant est [North, South]. La méthode exécute ces instructions :

    titles.remove("North");
    titles = new ArrayList<>();
    titles.add("East");
    

    Que voit encore l’appelant ?

    ---reveal---

    Il voit [South]. La suppression modifie d’abord l’objet partagé. La réaffectation redirige ensuite uniquement le paramètre de la méthode, donc East est ajouté à une autre liste. La référence de l’appelant n’a jamais été redirigée.

  12. 12
    DéfiCombine une copie, une recherche et une modification

    Soit a contenant [Lake, Hill], puis exécute b = new ArrayList<>(a), b.add("Lake") et b.remove(b.indexOf("Lake")). Que contiennent a et b, et a.equals(b) renvoie-t-il true ?

    ---reveal---

    La recherche renvoie l’indice 0, donc b devient [Hill, Lake]. L’original a reste [Lake, Hill]. Les tailles correspondent mais l’ordre diffère, donc equals pour les listes renvoie false.

  13. 13
    RécapitulatifPrévois une modification de liste

    Pour comprendre une modification, identifie d’abord sa cible : une position pour set ou une suppression par indice, une valeur pour une suppression par valeur et une position d’insertion pour add. Mets ensuite à jour les indices décalés avant de suivre l’appel suivant. Pour prévoir ce qu’une autre variable voit, détermine si elle partage la liste ou contient une copie distincte. Une réaffectation dans une méthode affecte son paramètre ; les modifications affectent l’objet que ce paramètre référence à ce moment.

2

Stocke et copie des mesures en nombre fixe

10 étapes
Utilise les cases fixes d’un tableau, examine les valeurs par défaut et préserve les données lors des copies et des échanges.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionAttribue une case fixe à chaque mesure
  2. 2
    ExplicationAlloue les cases
  3. 3
    ExempleAffiche les données nécessaires
  4. 4
    DéfiLis la dernière case
  5. 5
    ExempleSuis un alias
  6. 6
    ExempleCrée une copie plus grande
  7. 7
    DéfiChoisis une comparaison de contenu
  8. 8
    ExempleSauvegarde avant d’écraser
  9. 9
    DéfiConserve les anciennes données en agrandissant
  10. 10
    RécapitulatifDistingue les modifications de cases du nouveau stockage
3

Transforme des mesures en résultats

17 étapes
Suis l’état d’une boucle, calcule une moyenne, recherche selon une condition et supprime les valeurs indésirables sans erreur.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionAttribue une tâche précise à chaque boucle
  2. 2
    ExplicationLis les valeurs ou les positions
  3. 3
    DéfiLaisse de la place pour un voisin
  4. 4
    ExempleAccumule une somme au fil de la boucle
  5. 5
    ExempleDivise en conservant la partie fractionnaire
  6. 6
    Point cléUn extremum nécessite un candidat réel
  7. 7
    DéfiSuis le dernier maximum en cas d’égalité
  8. 8
    ExplicationArrête-toi seulement quand la réponse est connue
  9. 9
    ExempleTrouve la première mesure au-dessus d’une borne
  10. 10
    DéfiPasse de la première correspondance à toutes les correspondances
  11. 11
    ExempleObserve une suppression qui saute un élément en avançant
  12. 12
    ExplicationParcours à l’envers pour supprimer
  13. 13
    LienPréserve la source par filtrage
  14. 14
    ConseilUtilise l’itérateur qui gère le parcours
  15. 15
    DéfiDéfinis la borne d’une boucle qui ajoute
  16. 16
    DéfiCalcule la moyenne des seules valeurs sélectionnées
  17. 17
    RécapitulatifSuis l’état et les règles d’arrêt
4

Lis un enregistrement textuel par étapes

14 étapes
Examine des caractères, extrais une partie repérée et découpe un enregistrement en champs numériques.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDu texte brut aux données
  2. 2
    ExplicationLis un caractère à la fois
  3. 3
    ExempleCompte les chiffres dans une notation
  4. 4
    DéfiConserve une transformation
  5. 5
    ExplicationLocalise d’abord une borne
  6. 6
    ExempleCompte les positions incluses
  7. 7
    ConseilChoisis la règle de nettoyage
  8. 8
    DéfiGère un séparateur absent
  9. 9
    ExplicationDécoupe l’enregistrement en champs
  10. 10
    ExempleConvertis et calcule
  11. 11
    Point cléLes séparateurs peuvent décrire des motifs
  12. 12
    DéfiAnalyse après avoir vérifié la structure
  13. 13
    DéfiNormalise des mots et assemble-les
  14. 14
    RécapitulatifVérifie le type du résultat à chaque étape
5

Compare des commandes et assemble un compte rendu

12 étapes
Choisis des comparaisons de contenu, interprète l’ordre du texte et construis un résultat modifiable sans perdre l’original.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionCompare selon le sens et construis un résultat
  2. 2
    ExplicationChoisis un test de contenu
  3. 3
    ExempleIgnore la casse sans ignorer les espaces
  4. 4
    DéfiExplique un test fondé sur des littéraux
  5. 5
    ExplicationClasse selon le premier char différent
  6. 6
    DéfiConserve le candidat textuel qui vient en premier
  7. 7
    ExplicationAjoute à une séquence modifiable unique
  8. 8
    ExemplePlace les séparateurs entre les parties
  9. 9
    ExempleModifie les positions actuelles
  10. 10
    DéfiConserve l’ordre d’origine
  11. 11
    DéfiConstruis un compte rendu filtré
  12. 12
    RécapitulatifUtilise l’opération adaptée à la question

Listes et tableaux en Java : QCM

40 Questions Pratiques en 4 séries

Série 1 : Suis l’exécution des boucles et traite du texte10 Questions Pratiques

Question 1 sur 10

Après for (int n : values) { n += 3; } sur le tableau {2, 6, 9}, que contient le tableau ?
  1. [5, 9, 12]
  2. [3, 3, 3]
  3. [9, 9, 9]
  4. [2, 6, 9]
Afficher la réponseMasquer la réponse
Réponse : D
Chaque passage copie une valeur du tableau dans la variable locale n. Mettre à jour cette variable locale ne modifie pas une case stockée, donc le tableau reste [2, 6, 9]. Le résultat [5, 9, 12] nécessiterait une boucle à indice qui affecte une valeur à values[i].

Question 2 sur 10

Une liste d’entiers contient [5, 8, 9]. Après avoir calculé leur somme dans un int total, quelle valeur produit (double) (total / values.size()) ?
  1. 7.333333333333333
  2. 7.0
  3. 22.0
  4. 3.0
Afficher la réponseMasquer la réponse
Réponse : B
La somme est 22, mais les parenthèses effectuent une division entière par 3 avant le transtypage, ce qui produit 7. Le transtypage transforme ensuite ce résultat en 7,0. Pour conserver la partie fractionnaire, convertis un opérande avant de diviser, comme dans (double) total / values.size().

Question 3 sur 10

Pour la liste non vide [-8, -3, -3, -6], quelle paire ce code affiche-t-il ?

int best = 0;
int total = 0;
for (int i = 0; i < values.size(); i++) {
    int n = values.get(i);
    total += n;
    if (n >= values.get(best)) {
        best = i;
    }
}
System.out.println(best + ": " + (double) total / values.size());
  1. 2: -5.0
  2. 1: -5.0
  3. 2: -3.0
  4. 0: -5.0
Afficher la réponseMasquer la réponse
Réponse : A
La somme est -20, donc la division en virgule flottante par quatre donne -5,0. Le maximum -3 apparaît aux indices 1 et 2, et >= remplace le candidat en cas d’égalité, ce qui conserve l’indice 2. L’indice 1 serait conservé par >, qui rejette les remplacements par une valeur égale.

Question 4 sur 10

La méthode est appelée avec {"Birch", "Cedar", "Maple"} et la cible « Maple ». Que renvoie-t-elle ?

static int find(String[] a, String target) {
    for (int i = 0; i < a.length; i++) {
        if (a[i].equals(target)) return i;
        else return -1;
    }
    return -1;
}
  1. 0
  2. 2
  3. -1
  4. 3
Afficher la réponseMasquer la réponse
Réponse : C
Le premier élément Birch ne correspond pas à Maple, donc le else renvoie immédiatement -1. La boucle n’atteint jamais l’indice 2. Une recherche correcte de la première correspondance place le retour signalant l’échec après la boucle, ce qui permet de vérifier chaque candidat avant de déclarer la cible absente.

Question 5 sur 10

Quelle liste reste après cette boucle ?

ArrayList<Integer> a = new ArrayList<>(List.of(4, 4, 7, 2));
for (int i = 0; i < a.size(); i++) {
    if (a.get(i) % 2 == 0) a.remove(i);
}
  1. [7]
  2. [4, 7]
  3. [4, 7, 2]
  4. [4, 4, 7]
Afficher la réponseMasquer la réponse
Réponse : B
La suppression à l’indice 0 décale le deuxième 4 à l’indice 0, mais le passage suivant utilise l’indice 1 et voit 7. L’indice 2 contient alors 2, qui est supprimé, ce qui laisse [4, 7]. Obtenir [7] supposerait que le 4 décalé est vérifié à nouveau, ce que cette incrémentation inconditionnelle empêche.

Question 6 sur 10

Que produit "Count: " + 2 + 6 ?
  1. "Count: 26"
  2. "Count: 8"
  3. "8Count: "
  4. "Count: 2 6"
Afficher la réponseMasquer la réponse
Réponse : A
Le premier + a une chaîne à sa gauche, donc il assemble 2 sous forme de texte. Le + suivant assemble 6 à ce texte, ce qui produit "Count: 26". Pour obtenir "Count: 8", il faudrait des parenthèses autour de 2 + 6 afin d’effectuer d’abord l’addition.

Question 7 sur 10

Pour String code = "AB:472:Q";, que vaut code.substring(code.indexOf(":") + 1, code.lastIndexOf(":")) ?
  1. ":472"
  2. "472:"
  3. "47"
  4. "472"
Afficher la réponseMasquer la réponse
Réponse : D
Le premier deux-points est à l’indice 2 et le dernier à l’indice 6, donc l’expression utilise substring(3, 6). Elle inclut les trois chiffres et exclut le deux-points à la fin. Inclure ce dernier deux-points reviendrait à considérer l’indice de fin comme inclus.

Question 8 sur 10

Quel est le type renvoyé par "Mina;18;Oslo".split(";") ?
  1. ArrayList<String>
  2. String
  3. String[]
  4. int[]
Afficher la réponseMasquer la réponse
Réponse : C
Le découpage produit un tableau de champs textuels, donc le type du résultat est String[]. Le champ "18" reste du texte tant qu’il n’est pas converti ; split ne déduit pas les nombres. Même si une ArrayList pourrait ensuite contenir les champs, la méthode elle-même renvoie un tableau.

Question 9 sur 10

Combien de champs cette expression produit-elle ?

"x,y,,".split(",")
  1. 3
  2. 4
  3. 2
  4. 1
Afficher la réponseMasquer la réponse
Réponse : C
Par défaut, split supprime les parties vides à la fin, ce qui laisse "x" et "y". La méthode renvoie donc un tableau de longueur 2. Compter chaque virgule et ajouter un donne quatre positions apparentes, mais ignore la règle de suppression des parties vides finales.

Question 10 sur 10

Qu’est-ce qui est affiché ?

String[] p = "  Omar, 12, 5  ".trim().split(",");
int distanceKm = Integer.parseInt(p[1].trim());
int hours = Integer.parseInt(p[2].trim());
double speed = distanceKm / hours;
System.out.println(speed);
  1. 2.4
  2. 12.5
  3. NumberFormatException
  4. 2.0
Afficher la réponseMasquer la réponse
Réponse : D
Nettoyer chaque champ numérique avec trim permet de convertir les entiers et produit 12 et 5. Leur division reste une division entière, donc elle donne 2 avant que l’affectation à double ne le convertisse en 2.0. Une destination de type double ne suffit pas à conserver la partie fractionnaire lorsque les opérandes sont des entiers.
Série 2 : Combine des opérations sur les collections et le texte10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Quels sont les résultats de " ".isEmpty() et " ".isBlank(), dans cet ordre ?
  1. true, true
  2. false, false
  3. false, true
  4. true, false
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Quelles parties cette expression produit-elle ?

"  north   east west ".trim().split("\\s+")
  1. [north, east, west]
  2. [, north, east, west]
  3. [north, , , east, west]
  4. [north east west]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Une liste non vide de noms contient ["zen", "Able", "apple"]. Une boucle conserve le premier candidat et le remplace lorsque name.compareTo(first) < 0. Quel nom reste à la fin ?
  1. apple, car la casse est ignorée pendant la comparaison
  2. Able, car son premier char précède les minuscules
  3. zen, car aucun candidat suivant ne vient avant lui
  4. Aucun candidat, car comparer des casses différentes provoque une exception
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Une ArrayList<String> a une taille de 4. Que se passe-t-il lorsque add(4, "new") est suivi de get(4) ?
  1. The insertion throws; get is never reached.
  2. The insertion succeeds; get throws afterward.
  3. The insertion replaces the old final element.
  4. The insertion succeeds; get returns "new".
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Quels sont la liste out et la moyenne à la fin ?

int[] a = {-2, 6, 10, 0};
ArrayList<Integer> out = new ArrayList<>();
int sum = 0;
for (int n : a) {
    if (n > 0) {
        out.add(n);
        sum += n;
    }
}
double average = (double) sum / out.size();
  1. [6, 10] and 4.0
  2. [6, 10] and 8.0
  3. [-2, 6, 10, 0] and 3.5
  4. [6, 10, 0] and 5.333333333333333
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Quel indice est renvoyé pour l’entrée indiquée ?

static int firstLong(String[] words, int min) {
    for (int i = 0; i < words.length; i++) {
        String clean = words[i].trim();
        if (clean.length() >= min) return i;
    }
    return -1;
}
// Call:
firstLong(new String[] {"  ox  ", "pine", " map ", "cedar"}, 4)
  1. 0
  2. 3
  3. -1
  4. 1
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Que contiennent a et kept après ce code ?

ArrayList<Integer> a = new ArrayList<>(List.of(2, -1, -1, 5));
ArrayList<Integer> kept = new ArrayList<>(a);
for (int i = kept.size() - 1; i >= 0; i--) {
    if (kept.get(i) < 0) kept.remove(i);
}
a.set(0, 9);
  1. a: [9, -1, -1, 5]; kept: [2, 5]
  2. a: [9, 5]; kept: [9, 5]
  3. a: [9, -1, -1, 5]; kept: [9, 5]
  4. a: [9, -1, -1, 5]; kept: [2, -1, 5]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

La méthode doit renvoyer le texte après le premier « # », ou « missing » lorsqu’il n’y a pas de repère. Quel remplacement permet à la méthode de fonctionner pour les deux entrées « tag#blue » et « plain » ?

static String tail(String s) {
    int p = s.indexOf("#");
    MISSING
}
  1. if (p == 0) return "missing"; return s.substring(p + 1);
  2. if (p == -1) return "missing"; return s.substring(p);
  3. if (p == -1) return "missing"; return s.substring(p + 1);
  4. if (p > 0) return "missing"; return s.substring(p + 1);
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Quelle String la méthode renvoie-t-elle pour le tableau {"A", "B", "C"} ?

static String report(String[] parts) {
    StringBuilder sb = new StringBuilder();
    for (int i = parts.length - 1; i >= 0; i--) {
        if (sb.length() > 0) sb.append("/");
        sb.append(parts[i]);
    }
    sb.deleteCharAt(2);
    return sb.toString();
}
  1. "C/B/A"
  2. "C/BA"
  3. "A//C"
  4. "C//A"
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Que contiennent a et b après change(a) ?

static void change(ArrayList<String> x) {
    x.remove("red");
    x = new ArrayList<>();
    x.add("gold");
}
// In main:
ArrayList<String> a = new ArrayList<>(List.of("red", "blue", "red"));
ArrayList<String> b = a;
change(a);
  1. a: [gold]; b: [blue, red]
  2. a: [blue, red]; b: [blue, red]
  3. a: [blue]; b: [blue]
  4. a: [red, blue, red]; b: [red, blue, red]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 3 : Crée, modifie et partage des collections10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Quelle déclaration crée une liste vide et modifiable de valeurs entières ? Supposons que ArrayList et List sont importés.
  1. ArrayList<int> n = new ArrayList<>();
  2. Integer[] n = new Integer[0];
  3. ArrayList<Integer> n = new ArrayList<>();
  4. List<Integer> n = List.of();
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Qu’affiche ce code ?

ArrayList<String> tools = new ArrayList<>(List.of("pen", "ruler"));
tools.add(1, "tape");
String old = tools.set(2, "clip");
System.out.println(old + ": " + tools);
  1. ruler: [pen, tape, clip]
  2. tape: [pen, clip, ruler]
  3. ruler: [pen, clip, tape]
  4. clip: [pen, tape, clip]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Une ArrayList<Integer> contient [12, 24, 36]. Quel appel supprime la valeur 24 ?
  1. values.remove(24);
  2. values.remove(Integer.valueOf(1));
  3. values.set(1, 24);
  4. values.remove(Integer.valueOf(24));
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Une liste de noms contient [Nora, Ravi, Nora, Mei]. Après names.remove("Nora"), que valent names.indexOf("Nora") et names.lastIndexOf("Mei"), dans cet ordre ?
  1. 0 and 3
  2. 1 and 2
  3. -1 and 2
  4. 2 and 3
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Que contiennent a et c après ce code ?

ArrayList<String> a = new ArrayList<>(List.of("oak"));
ArrayList<String> b = a;
ArrayList<String> c = new ArrayList<>(a);
b.add("elm");
c.set(0, "ash");
  1. a: [oak]; c: [ash]
  2. a: [oak, elm]; c: [ash]
  3. a: [ash, elm]; c: [ash, elm]
  4. a: [oak, elm]; c: [ash, elm]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Que renvoie Arrays.toString(new boolean[3]) ?
  1. "[null, null, null]"
  2. "[0, 0, 0]"
  3. "[]"
  4. "[false, false, false]"
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Un double[] readings a une longueur de 6. Quelle expression lit sa dernière case ?
  1. readings[5]
  2. readings[6]
  3. readings.get(5)
  4. readings[readings.length()]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Que contiennent a et b après ce code ?

int[] a = {7, 3};
int[] b = Arrays.copyOf(a, 3);
b[0] = 8;
  1. a: [8, 3]; b: [8, 3, 0]
  2. a: [7, 3]; b: [8, 3]
  3. a: [7, 3]; b: [8, 3, 0]
  4. a: [7, 3, 0]; b: [8, 3, 0]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Deux tableaux créés séparément contiennent chacun {6, 2}. Quels sont les résultats de a.equals(b) et Arrays.equals(a, b), dans cet ordre ?
  1. false, true
  2. true, true
  3. true, false
  4. false, false
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Que contient la liste de l’appelant après edit(a) ?

static void edit(ArrayList<Integer> x) {
    x.set(0, x.get(0) + 2);
    x = new ArrayList<>(x);
    x.add(9);
}
// In main:
ArrayList<Integer> a = new ArrayList<>(List.of(5, 8));
edit(a);
  1. [5, 8]
  2. [7, 8, 9]
  3. [7, 8]
  4. [5, 8, 9]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 4 : Compare des valeurs et diagnostique des erreurs10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Quelle expression vérifie sans erreur si une String nommée reply, qui peut valoir null, contient exactement « ready » ?
  1. reply.equals("ready")
  2. "ready".equals(reply)
  3. reply == "ready"
  4. reply.compareTo("ready") == 0
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un constructeur de chaîne contient « note ». Après sb.append(3), quel texte contient-il ?
  1. "note"
  2. "3note"
  3. "note 3"
  4. "note3"
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Quelle est la valeur de "18".compareTo("4") < 0, et pourquoi ?
  1. true; the first character decides the order
  2. false; eighteen is greater than four
  3. true; two-character strings always come first
  4. false; the longer string always comes later
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Quel texte est stocké dans result ?

StringBuilder sb = new StringBuilder("plane");
sb.delete(1, 3);
sb.insert(1, "i");
String result = sb.toString();
  1. "pie"
  2. "pilane"
  3. "pine"
  4. "pline"
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Qu’affiche ce code ?

String label = "lamp";
String other = label;
label = label.toUpperCase();
System.out.println(other + ":" + label);
  1. Les deux variables conservent leur texte d’origine en minuscules.
  2. Les deux variables référencent le résultat en majuscules.
  3. L’original passe en majuscules ; le nouveau résultat reste en minuscules.
  4. L’original reste en minuscules ; la variable réaffectée est en majuscules.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Qu’affiche ce code ?

String[] a = {"ax", "beta", "brim", "sun"};
int first = -1;
int matches = 0;
for (int i = 0; i < a.length; i++) {
    if (a[i].startsWith("b")) {
        if (first == -1) first = i;
        matches++;
    }
}
System.out.println(first + ":" + matches);
  1. 1:2
  2. 2:2
  3. 1:1
  4. -1:2
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Quelle liste reste après ce code ?

ArrayList<Integer> a = new ArrayList<>(List.of(2, 5, 2));
for (int i = a.size() - 1; i >= 0; i--) {
    if (a.get(i) == 2) a.remove(i);
}
int n = a.size();
for (int i = 0; i < n; i++) {
    a.add(a.get(i) * 2);
}
  1. [5, 2, 10, 4]
  2. [5]
  3. [5, 10]
  4. [2, 5, 2, 4, 10, 4]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Que valent a et b après l’exécution du code ?

int[] a = {11, 4, 8};
int[] b = a;
int temp = b[0];
b[0] = b[2];
b[2] = temp;
b = Arrays.copyOf(b, 4);
b[1] = 0;
  1. a: [11, 4, 8]; b: [8, 0, 11, 0]
  2. a: [8, 4, 11]; b: [8, 0, 11, 0]
  3. a: [8, 0, 11]; b: [8, 0, 11, 0]
  4. a: [8, 4, 8]; b: [8, 0, 8, 0]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Une liste est vide. Un programme teste names.indexOf("Iris") >= 0 avant d’appeler get avec ce résultat. Que se passe-t-il ?
  1. Le test est faux, donc l’appel à get est ignoré.
  2. Le test est vrai et get renvoie null.
  3. indexOf déclenche une exception parce que la liste est vide.
  4. Le test est vrai et get déclenche une exception.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Qu’est-ce qui est affiché ?

StringBuilder a = new StringBuilder("drawer");
StringBuilder b = a;
String result = b.reverse().toString();
b = new StringBuilder("x");
System.out.println(a + ":" + result);
  1. drawer:reward
  2. x:reward
  3. reward:reward
  4. reward:drawer
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Tu bloques sur ton propre exercice ? Aide aux Devoirs

Mots-Clés

66 Mots-Clés, chacun avec sa définition

A

Accumulateur
Un accumulateur stocke un résultat construit au fil des passages d’une boucle ; il est initialisé avant la boucle et change au fur et à mesure que les éléments pertinents sont traités.
Un accumulateur de somme commence à 0 et ajoute chaque distance afin que le programme puisse indiquer le total en kilomètres.
Ajout en fin
Une opération d’ajout en fin ajoute la représentation textuelle d’une valeur à la fin d’un StringBuilder et renvoie ce même constructeur pour d’autres appels.
Un ajout en fin de 4 après « Page » suivi d’un espace transforme le constructeur en « Page 4 » sans réaffectation distincte.
Alias
Un alias est une autre variable ou un autre nom qui référence le même objet, de sorte que les modifications faites par un nom sont visibles par l’autre.
Après b = a, b est un alias de a ; b.clear() vide la liste lue par les deux variables.
Analyse syntaxique
L’analyse syntaxique convertit du texte en une valeur structurée, comme un int ou un double, selon la syntaxe acceptée par la méthode choisie.
L’analyse syntaxique de « 3.5 » avec Integer.parseInt échoue car cette méthode accepte du texte entier sans point décimal.
ArrayIndexOutOfBoundsException
Une ArrayIndexOutOfBoundsException signale une tentative de lecture ou d’écriture à une position de tableau située hors de l’intervalle de ses indices valides.
Une ArrayIndexOutOfBoundsException se produit lorsque le code lit l’indice 4 d’un tableau de quatre éléments.
ArrayList
Une ArrayList est une liste ordonnée et modifiable dont le nombre d’éléments augmente ou diminue lorsque des valeurs sont ajoutées ou supprimées.
Une ArrayList peut collecter des noms au fur et à mesure des saisies sans nécessiter à l’avance un nombre final.
Autoboxing
L’autoboxing est la conversion automatique par Java d’une valeur primitive en objet de la classe enveloppe correspondante.
L’autoboxing permet d’écrire numbers.add(8) même si le type des éléments de la liste est Integer, et non int.

B

Borne de boucle
Une borne de boucle est une limite dans la condition d’une boucle qui détermine les positions ou les itérations que son corps peut traiter.
Une borne de boucle i < a.length - 1 laisse de la place pour lire le voisin à droite avec a[i + 1].
Borne de fin exclue
Une borne de fin exclue désigne la première position omise d’un intervalle, ce qui rend le nombre de positions incluses égal à la fin moins le début.
La borne de fin exclue 5 dans substring(2, 5) inclut les positions 2, 3 et 4 mais exclut la position 5.
Boucle à indice
Une boucle à indice parcourt les éléments à l’aide d’une variable de position explicite, ce qui permet à son corps de lire des positions ou de remplacer des valeurs stockées.
Une boucle à indice peut afficher des noms avec des numéros de ligne en lisant names.get(i) et en affichant i + 1.
Boucle for-each
Une boucle for-each parcourt chaque valeur d’élément dans l’ordre sans indice explicite, en plaçant cette valeur dans une variable locale de boucle.
Une boucle for-each peut calculer la somme des valeurs d’un tableau, mais réaffecter sa variable int ne remplace pas les cases du tableau.

C

Caractères blancs
Les caractères blancs sont des caractères d’espacement ou de séparation reconnus par un test donné, notamment les espaces, les tabulations et les sauts de ligne.
Les caractères blancs Java sont reconnus par Character.isWhitespace, également utilisé par strip() et isBlank().
Chaînage de méthodes
Le chaînage de méthodes appelle une autre méthode directement sur un résultat renvoyé par un appel précédent, comme lorsque append renvoie le même constructeur de chaîne.
Le chaînage de méthodes permet sb.append("x").append(2), mais ne peut pas se poursuivre à partir de setCharAt, qui renvoie void.
Champ
Un champ est une partie des données d’un enregistrement, souvent séparée des parties voisines par un délimiteur comme une virgule ou un point-virgule.
Le deuxième champ de « Ari,18,4 » doit être converti si un programme a besoin de sa valeur numérique pour un calcul.
Champ length
Le champ length indique le nombre fixe de cases d’un tableau et se lit sans les parenthèses utilisées pour un appel de méthode.
Le champ length de new int[4] vaut 4 avant même que le programme écrive des valeurs personnalisées dans ses cases.
char
Un char est une valeur primitive Java qui stocke une unité de code UTF-16 ; un littéral de caractère s’écrit entre apostrophes.
Le char renvoyé par "book".charAt(0) est 'b', tandis que "b" est une String de longueur 1.
Classe enveloppe
Une classe enveloppe représente une valeur primitive sous forme d’objet, ce qui permet d’utiliser des valeurs comme les entiers comme éléments de liste.
La classe enveloppe Integer permet à une ArrayList<Integer> de stocker des nombres fournis sous forme de valeurs int.
Comparaison d’identité
Une comparaison d’identité vérifie si des références désignent le même objet, que des objets distincts contiennent ou non des données égales.
Une comparaison d’identité avec a == b vaut false pour des tableaux distincts contenant les mêmes entiers.
Comparaison de contenu
Une comparaison de contenu teste les caractères ou valeurs stockés dans des objets, ce qui permet à des objets String distincts de correspondre lorsque leur texte est égal.
Une comparaison de contenu avec reply.equals("go") reconnaît un texte correspondant même lorsque les objets diffèrent.
Comparaison sensible à la casse
Une comparaison sensible à la casse traite les lettres majuscules et minuscules comme distinctes pour déterminer si des textes correspondent.
Une comparaison sensible à la casse avec equals de String constate que « Go » et « go » ont des contenus différents.
compareTo
La méthode compareTo renvoie un résultat négatif, nul ou positif selon l’ordre de son objet receveur par rapport à son argument.
compareTo de String utilise les valeurs char UTF-16, donc un résultat inférieur à zéro signifie que l’objet receveur vient en premier.
Comptage conditionnel
Un comptage conditionnel indique combien d’éléments satisfont un test en ajoutant un à un compteur uniquement lorsque le test réussit.
Un comptage conditionnel peut indiquer combien de températures quotidiennes dépassent 30 degrés Celsius.
Concaténation
La concaténation assemble des valeurs en texte ; en Java, l’addition de String avec + se fait de gauche à droite, sauf si des parenthèses modifient le regroupement.
La concaténation fait que "N=" + 2 + 5 produit "N=25", car les nombres sont assemblés une fois que le texte a commencé.
ConcurrentModificationException
Une ConcurrentModificationException peut signaler qu’une collection a changé d’une manière que son itérateur actif n’était pas prévu pour gérer.
Une ConcurrentModificationException peut se produire dans un seul fil d’exécution lorsque le corps d’une boucle for-each supprime un élément de sa liste source.
Copie de tableau
Une copie de tableau est un tableau distinct rempli à partir d’un tableau existant, éventuellement avec une longueur différente et des cases supplémentaires contenant des valeurs par défaut.
Une copie de tableau créée avec Arrays.copyOf(a, 5) peut agrandir le stockage sans changer la longueur de a.
Copie superficielle
Une copie superficielle crée un conteneur distinct en copiant les valeurs ou références de ses éléments, sans dupliquer les objets référencés.
Une copie superficielle d’une liste de chaînes possède des cases indépendantes qui référencent toujours les mêmes objets String.

D

Découpage
Une opération de découpage divise le texte aux correspondances d’un motif de séparateur et renvoie un tableau de parties de texte sans les séparateurs eux-mêmes.
Un découpage sur les virgules transforme « Nia,25,Lima » en trois chaînes, dont le texte numérique qui n’a pas encore été converti.
Division entière
La division entière divise des opérandes entiers et supprime la partie fractionnaire, même si le quotient obtenu est ensuite stocké dans un double.
La division entière donne 4 pour 17 / 4 ; convertir d’abord un opérande permet d’obtenir le résultat fractionnaire 4,25.

É

Égalité de contenu
L’égalité de contenu vérifie si des conteneurs possèdent des éléments correspondants égaux dans le même ordre, sans exiger qu’ils soient un même objet partagé.
Pour les tableaux d’int, l’égalité de contenu est testée avec Arrays.equals(a, b), et non avec equals du tableau.

E

Expression régulière
Une expression régulière est un motif textuel dont les symboles peuvent décrire des correspondances allant au-delà des caractères littéraux exacts, comme dans les séparateurs de split de String.
Une expression régulière contenant un point non échappé correspond à des caractères au lieu de découper uniquement sur des points littéraux.

F

Filtrage
Un filtrage sélectionne les éléments qui satisfont une condition et peut les collecter dans une nouvelle liste sans modifier la collection d’origine.
Un filtrage conserve les mots d’au moins cinq caractères en ajoutant les mots correspondants à une liste de résultat distincte.

I

Immuabilité
L’immuabilité signifie que l’état stocké d’un objet ne peut pas changer après sa création : les transformations de String renvoient donc des résultats sans modifier l’objet.
L’immuabilité d’une String laisse un ancien alias inchangé lorsqu’une autre variable conserve le résultat de toUpperCase().
Indice
Un indice est une position numérotée à partir de zéro qui désigne un élément dans une liste, un tableau ou une chaîne ; la première position est 0.
L’indice du dernier élément d’une liste de quatre éléments est 3, donc get(3) lit cet élément.
Initialiseur de tableau
Un initialiseur de tableau fournit les valeurs des éléments à la création d’un tableau, le nombre de valeurs déterminant sa longueur.
L’initialiseur de tableau dans int[] a = {3, 6, 9}; crée trois cases contenant ces valeurs.
Itérateur
Un itérateur suit le parcours d’une collection, fournit la valeur suivante et permet la suppression par sa propre méthode.
Un Iterator peut supprimer le nombre pair qui vient d’être lu avec it.remove() tout en poursuivant le parcours de la liste.

J

Jointure
Une opération de jointure combine des parties de texte en une String avec un séparateur choisi placé entre les parties plutôt qu’après la dernière.
Une jointure avec String.join("/", pieces) transforme les parties « a », « b » et « c » en texte « a/b/c ».

L

Liste non modifiable
Une liste non modifiable refuse les modifications de ses éléments et de sa structure, notamment les ajouts, suppressions et remplacements.
La liste non modifiable renvoyée par List.of("east", "west") refuse un appel ultérieur à set.

M

Maximum
Un maximum est la plus grande valeur d’un ensemble de données non vide ; une boucle peut conserver la meilleure valeur trouvée jusque-là ou l’indice où elle apparaît.
Le maximum de {-7, -2, -5} est -2, valeur qu’un meilleur résultat initialisé à zéro ne permettrait pas d’obtenir.
Modification en place
Une modification en place change l’état d’un objet existant, de sorte que les références qui désignent déjà cet objet voient le contenu modifié.
Une modification en place avec reverse() modifie le constructeur d’origine, donc ses alias voient aussi le texte inversé.
Modification structurelle
Une modification structurelle change la taille ou la structure interne d’une ArrayList, par exemple lors de l’ajout ou de la suppression d’un élément pendant son parcours.
Une modification structurelle par l’intermédiaire de la liste source peut invalider l’état de son itérateur for-each.

N

NaN
NaN signifie « pas un nombre » et est un résultat en virgule flottante obtenu pour des opérations comme la division d’une somme nulle par un effectif nul.
Une moyenne calculée sur des données vides sous la forme 0.0 / 0 produit NaN au lieu d’une mesure utile.
null
null est la valeur de référence qui ne désigne aucun objet : une méthode d’instance ne peut donc pas être appelée par cette référence.
Un résultat null doit être vérifié avant que le code appelle length() sur une String qu’une recherche peut renvoyer.
NumberFormatException
Une NumberFormatException signale que du texte ne peut pas être converti dans le type numérique avec la méthode d’analyse demandée.
Une NumberFormatException résulte de Integer.parseInt(" 18") car l’espace initial n’est pas accepté.

O

Ordre lexicographique
L’ordre lexicographique compare des séquences à leur première position différente et place une chaîne plus courte avant une chaîne plus longue dont le préfixe est égal.
L’ordre lexicographique de Java place « 12 » avant « 8 » car les premiers char différents sont '1' et '8'.

P

Palindrome
Un palindrome se lit de la même façon dans les deux sens selon la règle de comparaison choisie, par exemple sans tenir compte de la casse et des caractères autres que les lettres.
Une vérification de palindrome peut normaliser les lettres, inverser un nouveau constructeur de chaîne et comparer les String obtenues.
Parcours
Un parcours consiste à visiter systématiquement les éléments d’une collection, par exemple en allant du premier au dernier élément avec une boucle.
Un parcours inverse commence au dernier indice et atteint l’indice 0 avant la fin de la boucle.
Passage par valeur
Le passage par valeur signifie qu’un paramètre de méthode reçoit une copie de la valeur d’un argument, y compris une copie de la référence pour un objet.
Le passage par valeur permet à un paramètre de liste de modifier des éléments partagés tout en gardant locale la réaffectation du paramètre.
Prédicat de recherche
Un prédicat de recherche est un test vrai ou faux qui détermine si un élément satisfait une condition de recherche, comme la présence d’un préfixe donné.
Le prédicat de recherche city.startsWith("M") trouve des noms selon une condition plutôt que selon une valeur exacte.

R

Recherche linéaire
Une recherche linéaire vérifie les éléments un par un jusqu’à ce qu’une correspondance réponde à la question ou que la fin établisse qu’aucun élément ne correspond.
Une recherche linéaire d’un nom absent parmi 14 entrées vérifie les 14 avant de renvoyer sa valeur d’échec.
Référence
Une référence est une valeur qui désigne un objet et permet à une variable d’y accéder au lieu de contenir directement son contenu.
Une référence copiée permet à deux variables d’ajouter des éléments au même objet ArrayList en mémoire.
Remplacement littéral
Un remplacement littéral substitue du texte ou des caractères correspondant exactement à la cible sans interpréter celle-ci comme un motif d’expression régulière.
Un remplacement littéral avec replace(".", "-") transforme les points de « a.b.c » en tirets.
Résultat de recherche
Un résultat de recherche indique si des données correspondantes ont été trouvées ou où elles se trouvent ; les recherches d’indice dans une liste utilisent -1 pour signaler l’absence de correspondance.
Le résultat de recherche de names.indexOf("Kai") peut être 0 : un test de présence doit donc accepter cet indice.
Retour anticipé
Un retour anticipé termine une méthode dès que son résultat est connu, par exemple lorsqu’une recherche de la première correspondance atteint un élément correspondant.
Un retour anticipé dans le if qui détecte la correspondance évite de vérifier les noms après la première correspondance trouvée.

S

Sous-chaîne
Une sous-chaîne est une partie contiguë d’une String, sélectionnée par un indice de début et éventuellement un indice de fin exclu.
La sous-chaîne allant des indices 1 à 3 de "planet" est sélectionnée avec substring(1, 4) et donne « lan ».
String
Une String est un objet Java immuable qui représente du texte sous forme d’une séquence de valeurs char UTF-16 accessibles par des positions commençant à zéro.
Une String contenant un nom peut être partagée sans risque, car convertir sa casse ne modifie pas l’objet d’origine.
StringBuilder
Un StringBuilder est une séquence de caractères modifiable qui permet des ajouts répétés efficaces et des modifications aux positions ou portions actuelles.
Un StringBuilder peut assembler un compte rendu sur plusieurs lignes sans reconstruire tout le préfixe après chaque ligne ajoutée.
Suppression par indice
La suppression par indice supprime l’élément à une position donnée, renvoie cet élément et décale chaque élément suivant vers la gauche.
La suppression par indice transforme [a, b, c] en [a, c] lorsque remove(1) supprime l’élément du milieu.
Suppression par parcours inverse
La suppression par parcours inverse parcourt les indices d’une liste du dernier au premier, de sorte qu’une suppression ne décale que des éléments déjà vérifiés par la boucle.
La suppression par parcours inverse retire des valeurs négatives adjacentes sans sauter celle qui glisse vers la gauche après une suppression.
Suppression par valeur
La suppression par valeur supprime le premier élément égal et renvoie une indication précisant si un élément correspondant a effectivement été supprimé.
La suppression par valeur laisse un doublon dans [a, b, a] après que remove("a") a supprimé le premier a.
Surcharge de méthode
Une surcharge de méthode est l’une de plusieurs méthodes portant le même nom mais ayant des types ou des nombres de paramètres différents.
La surcharge de la méthode de suppression sélectionnée par un argument int traite cet argument comme un indice.

T

Tableau
Un tableau est un objet comportant un nombre fixe de cases de même type, accessibles par des indices commençant à zéro à l’aide de crochets.
Un tableau de sept doubles peut stocker une température en degrés Celsius pour chaque jour d’une semaine.

U

Unboxing
L’unboxing est la conversion automatique par Java de la valeur stockée dans un objet enveloppe en valeur du type primitif correspondant.
L’unboxing fournit un int lorsque int first = numbers.get(0); lit un élément Integer de la liste.
Unité de code UTF-16
Une unité de code UTF-16 est l’unité stockée par un char Java ; un symbole affiché peut nécessiter une unité ou une paire d’unités.
Un émoji peut occuper deux unités de code UTF-16, ce qui influe sur le nombre renvoyé par length() de String.

V

Valeur par défaut
Une valeur par défaut est la valeur initiale que Java affecte à une case de tableau nouvellement créée, comme zéro, false ou null selon son type.
La valeur par défaut de chaque case d’un nouveau tableau de String est null : aucune méthode de String ne peut donc encore être exécutée sur ces cases.
Valeur sentinelle
Une valeur sentinelle est un résultat choisi spécialement pour signaler une situation comme l’absence de correspondance, et distinct des résultats ordinaires de réussite.
La valeur sentinelle -1 signale l’échec d’une recherche d’indice, car aucun indice valide ne peut être négatif.
Variable temporaire
Une variable temporaire conserve une valeur intermédiaire pendant que d’autres affectations modifient les positions où cette valeur a été lue.
Une variable temporaire sauvegarde le premier élément pendant un échange afin que l’affectation suivante ne le fasse pas perdre.

À propos de cette unité

Par StudeliSignaler une erreur

Crée ton propre Matériel d'Étude

Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.

Commencer