Moyen 5 questions

QCM Java 7 : Deque, Enum et Iterateurs - Maitrisez les Collections

Testez vos connaissances sur les concepts avances de Java 7 : manipulation des Deque avec element() et les iterateurs, utilisation des enumerations (enum) avec valueOf() et name(), et les differences entre les methodes d'iteration. Quiz de 5 questions pour developeurs Java intermediaires.

#java #deque #enum #collections #java7

Comment jouer ?

  • 1. Lisez chaque question attentivement
  • 2. Choisissez votre réponse parmi les options
  • 3. Cliquez sur "Voir la réponse" pour vérifier
  • 4. Comptez vos bonnes réponses à la fin !

Quiz: Java 7 - Deque, Enum et Iterateurs

5 questions | Difficulte: moyen

Ce quiz couvre trois concepts fondamentaux de Java 7 :

  • Deque (Double-Ended Queue) : Une collection permettant l’ajout et la suppression aux deux extremites
  • Enum : Les enumerations pour definir des ensembles de constantes type-safe
  • Iterateurs : Les differentes methodes pour parcourir les collections

Question 1

Quel est le but de l’instruction headItem = deque.element(); ?

  • A. Retrieve, but does not remove the last element of this deque.
  • B. Retrieve, but does not remove the first element of this deque.
  • C. Supprime et retourne le premier element de la file.
  • D. Ajoute un nouvel element a la fin de la file.
Voir la reponse

Reponse correcte: B

La methode element() de l’interface Deque permet de recuperer le premier element (la tete) de la file sans le supprimer. Cette methode leve une exception NoSuchElementException si le deque est vide. Elle est equivalente a getFirst() et constitue une operation de consultation pure (peek operation).

Deque<String> deque = new ArrayDeque<>();
deque.add("Premier");
deque.add("Deuxieme");

String head = deque.element(); // Retourne "Premier"
System.out.println(deque.size()); // Affiche 2 (l'element n'est pas supprime)

Pourquoi les autres reponses sont incorrectes :

  • A. element() recupere le premier element, pas le dernier. Pour le dernier, utilisez getLast().
  • C. element() ne supprime pas l’element. Pour supprimer et retourner, utilisez remove() ou poll().
  • D. element() est une operation de lecture, pas d’ecriture. Pour ajouter, utilisez add() ou offer().

Question 2

Quel est l’objectif principal d’un enum en Java ?

  • A. Creer des classes abstraites.
  • B. Declarer une variable statique.
  • C. Definir un ensemble de constantes pour une classe particuliere.
  • D. Representer les proprietes d’une instance.
Voir la reponse

Reponse correcte: C

Un enum en Java est un type special qui permet de definir un ensemble fixe de constantes nommees. C’est une maniere type-safe de representer un groupe de valeurs predefinies, comme les jours de la semaine, les saisons, ou les etats d’une application. Les enums offrent une securite au niveau de la compilation car le compilateur verifie que seules les valeurs valides sont utilisees.

public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER
}

// Utilisation type-safe
Season current = Season.SUMMER;

// Le compilateur rejettera ceci :
// Season invalid = "INVALID"; // Erreur de compilation !

Pourquoi les autres reponses sont incorrectes :

  • A. Les classes abstraites sont creees avec le mot-cle abstract class. Les enums sont des types distincts qui etendent implicitement java.lang.Enum.
  • B. Les variables statiques sont declarees avec le mot-cle static. Bien que les constantes enum soient implicitements public static final, ce n’est pas l’objectif principal d’un enum.
  • D. Les proprietes d’instance sont representees par des champs (fields) de classe. Un enum represente des valeurs fixes connues a la compilation, pas des proprietes variables.

Question 3

Quelle est la difference entre Season.valueOf(season) et season.name() dans le contexte d’un Enum ?

  • A. Il n’y a pas de difference, les deux expressions font exactement la meme chose.
  • B. La premiere expression retourne le nom de l’enum constant, tandis que la deuxieme expression retourne l’instance de l’enum.
  • C. La premiere expression retourne l’instance de l’enum, tandis que la deuxieme expression retourne son nom.
  • D. La premiere expression retourne l’instance de l’enum, mais seule lorsqu’elle est utilisee dans un contexte statique. La deuxieme expression retourne toujours l’instance.
Voir la reponse

Reponse correcte: C

Ces deux methodes effectuent des operations inverses. valueOf(String) est une methode statique qui prend une chaine de caracteres et retourne l’instance enum correspondante. A l’inverse, name() est une methode d’instance qui retourne le nom de la constante enum sous forme de String. Ces methodes sont complementaires et permettent la conversion bidirectionnelle entre String et Enum.

public enum Season { SPRING, SUMMER, AUTUMN, WINTER }

// valueOf() : String -> Enum
Season s = Season.valueOf("SUMMER"); // Retourne l'instance Season.SUMMER

// name() : Enum -> String
String nom = Season.SUMMER.name(); // Retourne la String "SUMMER"

// Elles sont inverses l'une de l'autre :
Season.valueOf(Season.SUMMER.name()) == Season.SUMMER // true

Pourquoi les autres reponses sont incorrectes :

  • A. Les deux methodes font exactement l’inverse l’une de l’autre : l’une convertit String vers Enum, l’autre Enum vers String.
  • B. C’est l’inverse ! valueOf() retourne l’instance, name() retourne le nom (String).
  • D. valueOf() fonctionne dans tous les contextes (c’est une methode statique donc appelable partout), pas seulement dans un contexte statique.

Question 4

Quelle est la difference entre les iterations sur un Deque a l’aide d’un Iterateur et d’une boucle For ?

  • A. Il n’y a pas de difference, ils sont tous deux utilises pour parcourir une structure de donnees.
  • B. La boucle For est plus rapide que l’iteration a l’aide d’un Iterateur.
  • C. L’utilisation d’un Iterateur est obligatoire pour un Deque, alors qu’une boucle For peut etre utilisee pour n’importe quelle structure de donnees.
  • D. Une boucle For permet de parcourir une structure de donnees en ordre inverse, tandis qu’un iterateur ne permet pas cela.
Voir la reponse

Reponse correcte: D

L’interface Deque offre deux methodes d’iteration : iterator() qui parcourt du premier au dernier element, et descendingIterator() qui parcourt dans l’ordre inverse. Cependant, une boucle for-each standard (enhanced for loop) utilise uniquement l’iterateur standard. Pour parcourir un Deque en ordre inverse, vous devez explicitement utiliser descendingIterator(). La boucle for-each offre plus de flexibilite avec les indices, tandis que l’iterateur permet des operations comme remove() pendant l’iteration.

Deque<String> deque = new ArrayDeque<>();
deque.add("A");
deque.add("B");
deque.add("C");

// Boucle for-each (ordre normal uniquement)
for (String s : deque) {
    System.out.print(s + " "); // A B C
}

// Iterator descendant (ordre inverse)
Iterator<String> descIt = deque.descendingIterator();
while (descIt.hasNext()) {
    System.out.print(descIt.next() + " "); // C B A
}

Pourquoi les autres reponses sont incorrectes :

  • A. Il y a des differences significatives : l’iterateur permet remove() pendant le parcours et offre descendingIterator() pour l’ordre inverse.
  • B. La boucle for-each utilise internement un iterateur, donc les performances sont equivalentes. La difference n’est pas la vitesse.
  • C. L’utilisation d’un Iterateur n’est pas obligatoire pour un Deque. On peut utiliser for-each, for classique avec toArray(), ou meme des streams en Java 8+.

Question 5

Quel est le comportement de l’instruction Season season = Season.valueOf(season); ?

  • A. Creer une nouvelle instance de l’enum Season avec un nouveau nom donne.
  • B. Recuperer une reference a l’instance de l’enum Season correspondante au parametre passe.
  • C. Modifier la valeur de l’instance de l’enum Season correspondante au parametre passe.
  • D. Supprimer la reference a l’instance de l’enum Season correspondante au parametre passe.
Voir la reponse

Reponse correcte: B

La methode statique valueOf(String) recherche parmi les constantes de l’enum celle dont le nom correspond exactement a la chaine passee en parametre, et retourne cette instance. Les enums sont des singletons : chaque constante n’existe qu’en un seul exemplaire en memoire. valueOf() ne cree jamais de nouvelle instance, elle retourne toujours une reference vers l’instance existante. Si aucune correspondance n’est trouvee, une IllegalArgumentException est levee.

public enum Season { SPRING, SUMMER, AUTUMN, WINTER }

// Recupere la reference vers l'instance existante
Season s1 = Season.valueOf("SUMMER");
Season s2 = Season.SUMMER;

System.out.println(s1 == s2); // true - meme instance !

// Exception si la valeur n'existe pas
Season invalid = Season.valueOf("INVALID"); // IllegalArgumentException

Pourquoi les autres reponses sont incorrectes :

  • A. On ne peut jamais creer de nouvelles instances d’enum a l’execution. Toutes les instances sont creees a la compilation. C’est une caracteristique fondamentale des enums.
  • C. Les enums sont immutables par conception. On ne peut pas modifier la valeur d’une constante enum.
  • D. valueOf() est une operation de lecture qui retourne une reference. Elle ne supprime rien et n’a aucun effet sur les instances existantes.

Pour aller plus loin

Ressources recommandees

Documentation officielle :

Concepts connexes a explorer

  1. ArrayDeque vs LinkedList : Comprendre quand utiliser chaque implementation de Deque
  2. EnumSet et EnumMap : Collections optimisees pour les enums
  3. Methodes avancees des enums : constructeurs, champs, et methodes personnalisees

Exemple pratique : Enum avec comportement

public enum Operation {
    PLUS("+") {
        public double apply(double x, double y) { return x + y; }
    },
    MINUS("-") {
        public double apply(double x, double y) { return x - y; }
    };

    private final String symbol;

    Operation(String symbol) { this.symbol = symbol; }

    public abstract double apply(double x, double y);

    @Override
    public String toString() { return symbol; }
}

// Utilisation
double result = Operation.PLUS.apply(3, 4); // 7.0

Points cles a retenir

  • Deque.element() consulte sans supprimer, leve une exception si vide
  • Deque.peek() est l’alternative qui retourne null si vide
  • enum.valueOf() convertit String vers Enum (leve IllegalArgumentException si invalide)
  • enum.name() convertit Enum vers String (toujours le nom exact de la constante)
  • Les enums sont des singletons immutables - comparaison avec == recommandee