Dans ce post, nous allons discuter de quelques questions importantes d’entretien sur Java SE 8 avec leurs réponses. Je rédigerai un autre post pour discuter des questions restantes sur Java SE 8.
Questions d’entretien sur Java 8
- Pourquoi avons-nous besoin d’un changement vers Java à nouveau ?
- Nouvelles fonctionnalités de Java SE 8 ?
- Avantages des nouvelles fonctionnalités de Java SE 8 ?
- Qu’est-ce qu’une expression Lambda ?
- Quelles sont les trois parties d’une expression Lambda ? Quel est le type d’une expression Lambda ?
- Qu’est-ce qu’une interface fonctionnelle ? Qu’est-ce qu’une interface SAM ?
- Est-il possible de définir notre propre interface fonctionnelle ? Qu’est-ce que @FunctionalInterface ? Quelles sont les règles pour définir une interface fonctionnelle ?
- L’annotation @FunctionalInterface est-elle obligatoire pour définir une interface fonctionnelle ? Quelle est l’utilité de l’annotation @FunctionalInterface ? Pourquoi avons-nous besoin d’interfaces fonctionnelles en Java ?
- Quand devons-nous utiliser l’API Stream de Java 8 ? Pourquoi avons-nous besoin d’utiliser l’API Stream de Java 8 dans nos projets ?
- Expliquez les différences entre l’API Collection et l’API Stream de Java.
- Qu’est-ce que Spliterator en Java SE 8? Différences entre Iterator et Spliterator en Java SE 8?
- Qu’est-ce que Optional en Java 8? Quelle est l’utilité de Optional? Avantages de Optional en Java 8?
- Qu’est-ce que l’inférence de type? Est-ce que l’inférence de type est disponible dans les anciennes versions comme Java 7 et avant, ou est-ce qu’elle est disponible uniquement dans Java SE 8?
Questions et réponses d’entretien sur Java 8
Dans cette section, nous allons prendre chaque question de la section précédente et y répondre avec une description détaillée. Si vous avez besoin de plus d’informations et d’exemples, veuillez consulter les articles précédents sur Java SE 8 disponibles dans JournalDEV.
Pourquoi avons-nous besoin de changements dans Java encore une fois?
Oracle Corporation a introduit de nombreux nouveaux concepts dans Java SE 8 afin d’introduire les avantages suivants:
- Pour utiliser efficacement les CPU multi-cœurs actuels
Récemment, nous pouvons observer des changements drastiques dans le matériel. De nos jours, tous les systèmes utilisent des CPU multi-cœurs (2, 4, 8, 16 cœurs, etc.) pour déployer et exécuter leurs applications. Nous avons besoin de nouvelles constructions de programmation en Java pour utiliser efficacement ces processeurs multi-cœurs et développer des applications hautement concurrentes et hautement évolutives. Pour utiliser les fonctionnalités FP
Oracle Corporation a introduit de nombreux concepts de programmation fonctionnelle (FP) dans Java SE 8 pour tirer parti des avantages de la FP.
Nouvelles fonctionnalités de Java SE 8 ?
- Expressions lambda
- Interfaces fonctionnelles
- API Stream
- API Date et heure
- Méthodes par défaut et méthodes statiques d’interface
- Spliterator
- Références de méthode et de constructeur
- Améliorations de l’API Collections
- Améliorations des utilitaires de concurrence
- Améliorations du framework Fork/Join
- Itération interne
- Opérations de tableau et de collection parallèles
- Optionnel
- Annotations de type et annotations répétables
- Réflexion des paramètres de méthode
- Encodage et décodage Base64
- Améliorations IO et NIO2
- Moteur JavaScript Nashorn
- Améliorations javac
- Changements JVM
- Profils compacts Java 8 : compact1,compact2,compact3
- JDBC 4.2
- JAXP 1.6
- Java DB 10.10
- Réseau
- Changements de sécurité
Avantages des nouvelles fonctionnalités de Java SE 8 ?
Nous pouvons obtenir les avantages suivants des nouvelles fonctionnalités de Java SE 8 :
- Code plus concis et lisible
- Code plus réutilisable
- Code plus testable et maintenable
- Code hautement concurrent et hautement évolutif
- Écrire du code parallèle
- Écrire des opérations similaires à une base de données
- Applications à meilleures performances
- Code plus productif
Qu’est-ce qu’une expression Lambda ?
Une expression lambda est une fonction anonyme qui accepte un ensemble de paramètres d’entrée et renvoie des résultats. Une expression lambda est un bloc de code sans nom, avec ou sans paramètres et avec ou sans résultats. Ce bloc de code est exécuté sur demande.
Quelles sont les trois parties d’une expression lambda? Quel est le type d’une expression lambda?
A Lambda Expression contains 3 parts:
- Liste de paramètres
Une expression lambda peut contenir zéro, un ou plusieurs paramètres. C’est optionnel.- Opérateur de flèche lambda
« > » est appelé opérateur de flèche lambda. Il sépare la liste des paramètres et le corps de l’expression.- Corps de l’expression lambda
Le type de « Journal Dev » est java.lang.String. Le type de « true » est Boolean. De la même manière, quel est le type d’une expression lambda? Le type d’une expression lambda est une Interface Fonctionnelle. Exemple : Quel est le type de l’expression lambda suivante?
() -> System.out.println("Hello World");
Cette expression lambda n’a pas de paramètres et ne renvoie aucun résultat. Son type est donc « java.lang.Runnable », une interface fonctionnelle.
Qu’est-ce qu’une interface fonctionnelle ? Qu’est-ce qu’une interface SAM ?
A Functional Interface is an interface, which contains one and only one abstract method. Functional Interface is also known as SAM Interface because it contains only one abstract method. SAM Interface stands for Single Abstract Method Interface. Java SE 8 API has defined many Functional Interfaces.
Est-il possible de définir notre propre interface fonctionnelle ? Qu’est-ce que @FunctionalInterface ? Quelles sont les règles pour définir une interface fonctionnelle ?
Oui, il est possible de définir nos propres interfaces fonctionnelles. Nous utilisons l’annotation @FunctionalInterface de Java SE 8 pour marquer une interface comme interface fonctionnelle. Nous devons suivre ces règles pour définir une interface fonctionnelle :
- Définir une interface avec une et une seule méthode abstraite.
- Nous ne pouvons pas définir plus d’une méthode abstraite.
- Utiliser l’annotation @FunctionalInterface dans la définition de l’interface.
- Nous pouvons définir n’importe quel nombre d’autres méthodes comme des méthodes par défaut, des méthodes statiques.
- Si nous substituons la méthode de la classe java.lang.Object par une méthode abstraite, cela ne compte pas comme une méthode abstraite.
Est-ce que@FunctionalInterface l’annotation est-elle obligatoire pour définir une interface fonctionnelle? Quelle est l’utilité de l’annotation @FunctionalInterface? Pourquoi avons-nous besoin d’interfaces fonctionnelles en Java?
Ce n’est pas obligatoire de définir une interface fonctionnelle avec l’annotation @FunctionalInterface. Si nous ne le voulons pas, nous pouvons omettre cette annotation. Cependant, si nous l’utilisons dans la définition de l’interface fonctionnelle, le compilateur Java force à utiliser une et une seule méthode abstraite à l’intérieur de cette interface. Pourquoi avons-nous besoin d’interfaces fonctionnelles? Le type d’une expression Lambda de Java SE 8 est une interface fonctionnelle. Partout où nous utilisons des expressions Lambda, cela signifie que nous utilisons des interfaces fonctionnelles.
Quand devons-nous utiliser Java 8 Stream API ? Pourquoi avons-nous besoin d’utiliser Java 8 Stream API dans nos projets ?
Lorsque notre projet Java veut effectuer les opérations suivantes, il est préférable d’utiliser l’API Java 8 Stream pour bénéficier de nombreux avantages :Lorsque nous voulons effectuer des opérations similaires à une base de données. Par exemple, nous voulons effectuer des opérations de regroupement, de tri, etc.
- Lorsque nous voulons effectuer des opérations de manière paresseuse.
- Lorsque nous voulons écrire une programmation de style fonctionnel.
- Lorsque nous voulons effectuer des opérations parallèles.
- Lorsque nous voulons utiliser l’itération interne.
- Lorsque nous voulons effectuer des opérations de pipeline.
- Lorsque nous voulons obtenir de meilleures performances.
Expliquez les différences entre l’API Collection et l’API Stream ?
S.No. | Collection API | Stream API |
---|---|---|
1. | It’s available since Java 1.2 | It is introduced in Java SE 8 |
2. | It is used to store Data (A set of Objects). | It is used to compute data (Computation on a set of Objects). |
3. | We can use both Spliterator and Iterator to iterate elements. We can use forEach to performs an action for each element of this stream. | We can’t use Spliterator or Iterator to iterate elements. |
4. | It is used to store unlimited number of elements. | Stream API is used to process on the elements of a Collection. |
5. | Typically, it uses External Iteration concept to iterate Elements such as Iterator. | Stream API uses internal iteration to iterate Elements, using forEach methods. |
6. | Collection Object is constructed Eagerly. | Stream Object is constructed Lazily. |
7. | We add elements to Collection object only after it is computed completely. | We can add elements to Stream Object without any prior computation. That means Stream objects are computed on-demand. |
8. | We can iterate and consume elements from a Collection Object at any number of times. | We can iterate and consume elements from a Stream Object only once. |
Qu’est-ce que Spliterator en Java SE 8? Quelles sont les différences entre Iterator et Spliterator en Java SE 8?
Spliterator signifie « Splitable Iterator ». Il a été introduit par Oracle Corporation dans le cadre de Java SE 8. Comme Iterator et ListIterator, il fait également partie de l’interface Iterator.
S.No. | Spliterator | Iterator |
---|---|---|
1. | It is introduced in Java SE 8. | It is available since Java 1.2. |
2. | Splitable Iterator | Non-Splitable Iterator |
3. | It is used in Stream API. | It is used for Collection API. |
4. | It uses Internal Iteration concept to iterate Streams. | It uses External Iteration concept to iterate Collections. |
5. | We can use Spliterator to iterate Streams in Parallel and Sequential order. | We can use Iterator to iterate Collections only in Sequential order. |
6. | We can get Spliterator by calling spliterator() method on Stream Object. | We can get Iterator by calling iterator() method on Collection Object. |
7. | Important Method: tryAdvance() | Important Methods: next(), hasNext() |
Qu’est-ce que Optional en Java 8? À quoi sert Optional? Quels sont les avantages de Java 8 Optional?
Optional: Optional est une classe finale introduite dans Java SE 8. Elle est définie dans le package java.util. Elle est utilisée pour représenter des valeurs optionnelles qui existent ou n’existent pas. Elle peut contenir soit une valeur, soit aucune valeur. Si elle contient une valeur, nous pouvons l’obtenir. Sinon, nous n’obtenons rien. C’est une collection bornée, c’est-à-dire qu’elle ne peut contenir qu’un seul élément au maximum. C’est une alternative à la valeur « null ». Le principal avantage d’Optional est:
- Il est utilisé pour éviter les vérifications de nullité.
- Il est utilisé pour éviter les « NullPointerException ».
Qu’est-ce que l’inférence de type ? L’inférence de type est-elle disponible dans les anciennes versions comme Java 7 et avant, ou est-elle disponible uniquement dans Java SE 8 ?
L’inférence de type signifie déterminer le type par le compilateur au moment de la compilation. Ce n’est pas une nouvelle fonctionnalité de Java SE 8. Elle est disponible dans Java 7 et avant Java 7 également. Avant Java 7 : Explorons les tableaux Java. Définissons un tableau de chaînes avec des valeurs comme indiqué ci-dessous :
String str[] = { "Java 7", "Java 8", "Java 9" };
Ici, nous avons attribué quelques valeurs de chaînes à droite, mais nous n’avons pas défini leur type. Le compilateur Java infère automatiquement leur type et crée un tableau de chaînes. Java 7 : Oracle Corporation a introduit le nouvel opérateur « Diamond » dans Java SE 7 pour éviter les définitions de type inutiles dans les génériques.
Map<String,List<Customer>> customerInfoByCity = new HashMap<>();
Ici, nous n’avons pas défini d’informations de type à droite, nous avons simplement utilisé l’opérateur « Diamond » de Java SE 7. Java SE 8 : Oracle Corporation a beaucoup amélioré ce concept d’inférence de type dans Java SE 8. Nous utilisons ce concept pour définir des expressions lambda, des fonctions, des références de méthodes, etc.
ToIntBiFunction<Integer,Integer> add = (a,b) -> a + b;
{
« error »: « Upstream error… »
}
Source:
https://www.digitalocean.com/community/tutorials/javase8-interview-questions-part1