Les questions suivantes ont été posé à un candidat disposant de 8 ans d’expérience pour le poste Java BackEnd.
Que signifie l’encapsulation en Java ?
L’encapsulation permet de cacher les détails internes d’une classe et de contrôler l’accès à ses membres en définissant des niveaux d’accessibilité appropriés.
l’encapsulation en Java permet de regrouper les données et les méthodes associées dans une classe, de masquer les détails internes de cette classe et de contrôler l’accès à ses membres pour garantir une manipulation sécurisée des données.
Que signifie l’héritage en Java ?
L’héritage est un concept fondamental de la programmation orientée objet (POO) et est largement utilisé en Java. Il permet à une classe (appelée classe fille ou sous-classe) d’hériter des attributs et des méthodes d’une autre classe (appelée classe mère ou superclasse). Cela permet de réutiliser le code existant, d’organiser le code de manière logique et de créer une hiérarchie de classes.
Quels sont les types de mémoire JVM ?
En Java, la gestion de la mémoire est gérée par la JVM (Java Virtual Machine) et se compose de différents types de mémoire, chacun ayant un rôle spécifique dans l’exécution des programmes Java. Voici les principaux types de mémoire utilisés dans Java :
Mémoire vive (Heap Memory) :
La mémoire vive est l’espace de mémoire principal dans lequel les objets Java sont alloués et conservés pendant l’exécution du programme.
C’est la principale zone de mémoire utilisée pour le stockage des instances d’objets, des tableaux et des données dynamiques.
La mémoire vive est gérée par le ramasse-miettes (garbage collector) de la JVM, qui est responsable de la libération de la mémoire des objets qui ne sont plus référencés.
Mémoire de la pile (Stack Memory) :
La mémoire de la pile est utilisée pour stocker les variables locales et les données associées aux méthodes et aux threads.
Chaque thread Java a sa propre pile de mémoire, ce qui garantit que les variables locales et les paramètres de méthode sont isolés entre les threads.
La mémoire de la pile est gérée de manière automatique par la JVM et est libérée lorsque la méthode ou le thread associé se termine.
Mémoire permanente (Permanent Generation) :
La mémoire permanente (ou PermGen) est une zone de mémoire utilisée pour stocker les métadonnées de classe Java, telles que les définitions de classes, les constantes, les méthodes statiques et autres données de structure de classe.
Mémoire native (Native Memory) :
La mémoire native est l’espace de mémoire utilisé par la JVM elle-même et par les bibliothèques natives utilisées par les applications Java.
Cela inclut la mémoire utilisée par le code natif, les DLL partagées chargées, les structures de données de la JVM et autres ressources système utilisées par la machine virtuelle.
En résumé, Java utilise plusieurs types de mémoire, dont la mémoire vive, la mémoire de la pile, la mémoire permanente (ou Métaspace) et la mémoire native, pour gérer efficacement l’exécution des programmes Java. Chaque type de mémoire joue un rôle spécifique dans le stockage et la gestion des données lors de l’exécution des programmes Java.
Quelles sont les API les plus connus dans java ?
Il existe de nombreuses API disponibles en Java, couvrant une gamme étendue de fonctionnalités pour le développement d’applications dans divers domaines.
Java dispose d’une vaste bibliothèque standard, également appelée API (Application Programming Interface), qui fournit un large éventail de fonctionnalités pour le développement d’applications. Voici quelques-unes des API les plus connues en Java :
1-Java SE (Standard Edition) API :
C’est l’API de base de Java, qui fournit les fondations pour le développement d’applications Java standard.
Elle comprend des packages pour la gestion des collections, les entrées/sorties (I/O), les threads, les exceptions, les données, les fichiers, les réseaux, etc.
2-Java EE (Enterprise Edition) API :
L’API Java EE est utilisée pour le développement d’applications d’entreprise et de serveur.
Elle comprend des packages pour les servlets, les JSP (JavaServer Pages), les EJB (Enterprise JavaBeans), JPA (Java Persistence API), JMS (Java Message Service), JSF (JavaServer Faces), etc.
3-JDBC (Java Database Connectivity) API:
JDBC est utilisé pour l’accès aux bases de données relationnelles à partir de programmes Java.
Il fournit des packages pour établir des connexions à une base de données, exécuter des requêtes SQL, récupérer des résultats, etc.
4-JAX-RS (Java API for RESTful Web Services):
JAX-RS est utilisé pour le développement d’applications RESTful en Java.
Il fournit des packages pour la création de services web RESTful, la gestion des requêtes et des réponses HTTP, la sérialisation/désérialisation JSON, etc.
5-JUnit API :
JUnit est un framework de test unitaire pour Java.
Il fournit des packages pour l’écriture de tests unitaires, l’exécution de tests, l’assertion de résultats, etc.
6-Swing API :
Swing est une API pour la création d’applications graphiques en Java.
Elle fournit des packages pour les composants graphiques (boutons, champs de texte, fenêtres, etc.), la gestion des événements, le dessin, etc.
Quelle est la différence entre equals et l’opérateur ‘==’ ?
La méthode equals() est utilisé pour comparer le contenu des objets, tandis que == est utilisé pour comparer les références des objets en mémoire. Il est important de comprendre la différence entre les deux et de les utiliser correctement en fonction du besoin.
Quelle est la différence entre Collection et Stream dans Java ?
Les collections sont utilisées pour stocker et manipuler des données de manière permanente, tandis que les streams sont utilisés pour effectuer des transformations sur les données à la volée. Les collections sont plus adaptées aux opérations de stockage et d’accès aux données, tandis que les streams sont plus adaptés aux opérations de transformation et de traitement des données.
Voici leurs principales différences :
Collections |
Streams |
Une collection en Java est une structure de données qui peut contenir un ensemble d’objets.
|
Un stream en Java est une séquence d’éléments qui prend en charge des opérations de traitement de flux de données.
|
Les collections permettent de stocker, d’ajouter, de supprimer et d’accéder aux éléments de manière arbitraire |
Les streams ne stockent pas de données par elles-mêmes ; elles fournissent un moyen de manipuler les données à la volée.
|
Les collections sont généralement utilisées pour stocker des données de manière permanente et pour accéder et manipuler les données à tout moment.
|
Les streams prennent en charge des opérations de transformation, de filtrage et d’agrégation de données, ainsi que des opérations de parallélisme.
|
Les collections peuvent être itérées à l’aide de boucles comme for ou foreach.
|
Les streams sont généralement utilisés pour effectuer des transformations sur les données de manière fonctionnelle et déclarative, en appliquant des opérations telles que map, filter, reduce, etc.
|
|
Les streams ne sont pas des structures de données, mais plutôt des pipelines de traitement de données qui peuvent être utilisés pour transformer et traiter les données à la volée.
|
Quelle est la différence entre le build et le packaging ?
Le build est le processus de compilation et de construction du code source en un artefact exécutable ou de déploiement, tandis que le packaging est le processus de regroupement des fichiers et des dépendances de l’application dans une structure spécifique pour le déploiement ou la distribution. Le build produit les artefacts, tandis que le packaging prépare ces artefacts pour être distribués ou déployés dans un environnement cible.
Build :
Le résultat du build peut être un exécutable, un fichier JAR, un fichier WAR, ou tout autre artefact qui est prêt à être exécuté ou déployé.
Packaging :
Pendant le processus de packaging, les artefacts générés lors du build (par exemple, les fichiers JAR, les fichiers de configuration, les ressources, etc.) sont regroupés ensemble dans un format spécifique.
Le résultat du packaging peut être un fichier compressé (tel qu’un fichier ZIP ou TAR), un fichier exécutable auto-contenu, un conteneur Docker, etc., prêt à être distribué ou déployé sur un environnement d’exécution.
Quelle est la différence entre git merge et git rebase ?
-git merge fusionne les modifications de deux branches en créant un nouveau commit de fusion, tandis que git rebase réapplique les commits d’une branche sur une autre base pour maintenir une histoire de commits linéaire et propre.
Le choix entre les deux dépend de la structure de l’historique des commits et des préférences de gestion de l’historique du projet.
A quoi sert la fonctionnalité squash dans git ?
La fonctionnalité de “squash” est proposée lors de l’utilisation de certaines commandes telles que git rebase ou git merge pour fusionner et condenser plusieurs commits en un seul.
1-Utilisation avec git rebase :
Lorsque vous effectuez un rebase interactif avec git rebase -i, vous pouvez spécifier l’option squash (abrégée en s) pour condenser plusieurs commits en un seul. Voici comment procéder :
git rebase -i HEAD~n
Cela ouvrira l’éditeur avec une liste des n derniers commits. Pour fusionner des commits, remplacez pick par squash ou s pour les commits que vous souhaitez condenser.
2-Utilisation avec git merge :
Lorsque vous fusionnez des branches avec git merge, vous pouvez également utiliser l’option –squash pour condenser les commits. Voici comment faire :
git merge --squash <nom_de_la_branche>
Cela fusionnera les modifications de la branche spécifiée en une seule branche sans créer de commit de fusion, vous laissant la possibilité de créer un seul commit avec toutes les modifications.
Que signifie CORS ?
CORS (Cross-origin Resource Sharing) est un mécanisme de sécurité utilisé par les navigateurs web pour permettre à des ressources web d’être partagées entre des origines (domaines, protocoles ou ports) différentes.
A quoi sert l’annotation @CrossOrigin dans Spring ?
L’utilisation de @CrossOrigin peut être utile lors du développement d’une applications web où les ressources sont consommées par des clients hébergés sur des domaines différents de celui de l’API. Cela permet de résoudre les problèmes de restrictions de politique de même origine (Same Origin Policy) dans les navigateurs web.
@RestController @RequestMapping("/api") public class ExempleController {
@CrossOrigin(origins = "http://exemple.com") @GetMapping("/example") public ResponseEntity<String> exempleMethod() { // Logique de la méthode return ResponseEntity.ok("Réponse de la méthode exemple"); } }
la méthode exampleMethod() du contrôleur ExampleController autorise les requêtes HTTP provenant du domaine http://example.com à accéder à cette ressource. Les requêtes HTTP provenant de tout autre domaine seront refusées par défaut, sauf si d’autres configurations spécifiques sont définies.
A quoi sert la sérialisation en Java ?
La sérialisation en Java est un mécanisme qui permet de convertir un objet Java en une séquence d’octets, souvent dans le but de le stocker sur un support de stockage persistant (comme un fichier) ou de le transférer via un réseau. Cette séquence d’octets peut ensuite être désérialisée pour reconstituer l’objet d’origine.
La sérialisation est utilisée dans de nombreux contextes, notamment pour :la Persistance des données (enregistrer dans des fichiers ou des bases de données afin de les récupérer ultérieurement), Communication réseau (sérialiser des objets Java pour les transmettre via un réseau dans une architecture client-serveur), Passage de paramètres (passer des objets complexes entre différentes parties d’une application Java).
En Java, la sérialisation est mise en œuvre à l’aide de l’interface Serializable
. Pour qu’un objet puisse être sérialisé, il doit implémenter cette interface. Ensuite, vous pouvez utiliser les classes ObjectOutputStream
pour sérialiser un objet et ObjectInputStream
pour le désérialiser.
Quelle est la différence entre dockerFile et docker-Compose ?
-Docker est un fichier texte qui contient une série d’instructions permettant de créer une image Docker. Ces instructions incluent la spécification de l’image de base, la copie des fichiers sources dans l’image, l’installation des dépendances, la configuration de l’environnement, etc.
La commandedocker build
permet de créer une image Docker à partir de ce fichier.
-Docker Compose est un outil qui permet de définir et de gérer des applications Docker multi-conteneurs. Il utilise un fichier YAML appelé docker-compose.yml
pour décrire les services, les réseaux et les volumes nécessaires à l’application (les variables d’environnement, les ports exposés, les liens entre les services).