Disclosure: This post includes affiliate links; I may receive compensation if you purchase products or services from the different links provided in this article.
_
Hello devs, are you preparing for Java developer interviews? If Yes, here is a list of some useful Java interview questions for experienced Java programmers having experience in range of 2 to 5 years.
As an experienced developer you are expected to learn about OOP concepts, Java basics, Java Collection framework, Multi-threading and Concurrency utilities introduced in Java 5 and 6, Debugging Java application, Algorithm and Data structure, Some questions on design patterns, JVM and Garbage collection and couple of puzzles.
Actually its mix of everything you do in your day to day work.
If you are going for Java developer with some exposure on web development you will also be asked about popular Java frameworks like Spring, Hibernate, Struts 2.0 and others.
If you have more than 5 years of experience you can also expect questions about build tools like Maven, ANT and Gradle, Java best practices, Unit testing and JUnit and your experience about solving production issues.
One of the most common question I have faced is talking about the last production problem you have faced and how did you solved it.
If you are asked same question, give them step by step detail, right from analyzing problem to tactical fix to strategic solution.
In this article, I am going to share my list of Java Interview question for Java guys having 2 to 5 years of experience. Since I had similar experience couple of year ago, I know what questions are asked and keeping a list for your own always helps when you start looking for new challenge in your career.
I am not providing answers of these question in this post due to two reasons, questions are quite simple and you guys probably know the answer, second providing answer means I cannot use this post for my own preparation later, which is more important.
Though, I could write another article answering all these question if anyone request or I feel people need it.
By the way, if you are new to Java programming language or want to improve Java skills then you can also checkout sites like CodeGym, ZTM and karpado to learn Java by building Games and projects.
This list contains questions from different topics e.g. OOP concepts, multi-threading and concurrency, Java collections, Web services, Spring, Hibernate, Database and JDBC, it doesn't cover all topics you need to prepare.
I will add few more topics later when I have some time, for now, try to answer these questions without doing Google :)
Here are a couple of questions on OOP design, SOLID principle and baseic programming concepts
Loose coupling allows components to interact with each other with minimal dependencies, while tight coupling creates strong dependencies between components.
Cohesion refers to the degree to which elements within a module belong together, while coupling refers to the degree of interdependence between modules.
Liskov Substitution principle states that objects of a superclass should be replaceable with objects of its subclasses without affecting the correctness of the program.
For example, if you have a class hierarchy with a superclass "Shape" and subclasses "Circle" and "Square", any method that works with Shape should also work with Circle or Square without causing errors.
Abstract classes can have both abstract and concrete methods, while interfaces can only have abstract methods. Additionally, a class can implement multiple interfaces but can only extend one abstract class.
Composition implies a strong ownership relationship where the lifetime of the contained object is dependent on the container.
L'agrégation implique une relation plus faible où l'objet contenu peut exister indépendamment du conteneur. L'association implique une relation entre deux classes sans aucune dépendance en matière de propriété ou de cycle de vie.
Voyons maintenant quelques questions des collections et du flux
Les listes conservent les éléments dans un ordre séquentiel et autorisent les doublons (par exemple, ArrayList, LinkedList). Les ensembles n'autorisent pas les doublons et ne garantissent pas l'ordre (par exemple, HashSet, TreeSet). Les cartes stockent les paires clé-valeur et n'autorisent pas les clés en double (par exemple, HashMap, TreeMap).
Les collections synchronisées utilisent un verrouillage explicite pour assurer la sécurité des threads, permettant à un seul thread de modifier la collection à la fois. Les collections simultanées utilisent des algorithmes non bloquants et sont conçues pour une concurrence élevée, permettant à plusieurs threads de modifier la collection simultanément sans verrouillage explicite.
La méthode get de HashMap calcule le code de hachage de la clé fournie, détermine l'index dans le tableau sous-jacent en fonction du code de hachage, puis recherche la clé à cet index. S'il est trouvé, il renvoie la valeur correspondante ; sinon, il renvoie null.
ConcurrentHashMap permet un accès simultané à la carte sans blocage, tandis que Hashtable utilise des méthodes synchronisées pour assurer la sécurité des threads, ce qui entraîne des goulots d'étranglement potentiels en termes de performances. ConcurrentHashMap assure la sécurité des threads en divisant la carte en segments, chacun avec son verrou, permettant à plusieurs threads de modifier différents segments simultanément.
Utilisez LinkedList lorsque des opérations d'insertion et de suppression fréquentes sont nécessaires, car LinkedList permet une insertion et une suppression en temps constant à n'importe quelle position. Utilisez ArrayList lorsque l'accès aléatoire et les itérations sont fréquents, car ArrayList fournit un accès en temps constant par index.
Maintenant, il est temps de voir les questions liées aux concepts de multithreading et de concurrence Java :
Notify et notifyAll sont des méthodes Java utilisées pour réveiller les threads en attente sur un moniteur (c'est-à-dire en attente d'acquérir le verrou d'un objet). notify réveille un thread sélectionné au hasard, tandis que notifyAll réveille tous les threads en attente. notifyAll est préféré car il garantit que tous les threads en attente sont notifiés, évitant ainsi une attente indéfinie potentielle et améliorant la réactivité du système.
Une condition de concurrence critique se produit lorsque le résultat d'un programme dépend du timing ou de l'entrelacement de plusieurs threads. Pour éviter les conditions de concurrence critique, vous pouvez utiliser des mécanismes de synchronisation tels que des verrous, des sémaphores ou des opérations atomiques pour garantir que les sections critiques du code sont exécutées de manière atomique ou uniquement par un thread à la fois.
Un blocage se produit lorsque deux threads ou plus sont bloqués en attendant que l'autre libère les ressources dont ils ont besoin pour continuer. Pour éviter les blocages, vous pouvez utiliser des techniques telles que le classement des ressources, l'évitement des verrous imbriqués ou l'utilisation de délais d'attente pour l'acquisition de verrous. De plus, concevoir un code avec un ordre de verrouillage clair et cohérent peut aider à éviter les blocages.
Certaines classes de concurrence de haut niveau fournies par java.util.concurrent incluent ExecutorService, ThreadPoolExecutor, CountDownLatch, Semaphore, CyclicBarrier, BlockingQueue et ConcurrentHashMap. Ces classes fournissent des implémentations thread-safe de modèles et de mécanismes de concurrence courants tels que les pools de threads, les primitives de synchronisation et les structures de données concurrentes.
Oui, voici le code :
import java.util.concurrent.ArrayBlockingQueue; class Producer implements Runnable { private final ArrayBlockingQueue<Integer> queue; private int count = 0; Producer(ArrayBlockingQueue<Integer> queue) { this.queue = queue; } public void run() { try { while (true) { queue.put(produce()); Thread.sleep(1000); // Simulate some work } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } private int produce() { System.out.println("Producing: " + count); return count++; } } class Consumer implements Runnable { private final ArrayBlockingQueue<Integer> queue; Consumer(ArrayBlockingQueue<Integer> queue) { this.queue = queue; } public void run() { try { while (true) { consume(queue.take()); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } private void consume(int item) { System.out.println("Consuming: " + item); } } public class Main { public static void main(String[] args) { ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10); Producer producer = new Producer(queue); Consumer consumer = new Consumer(queue); Thread producerThread = new Thread(producer); Thread consumerThread = new Thread(consumer); producerThread.start(); consumerThread.start(); } }
JDBC est utilisé pour connecter une base de données à partir d'un programme Java, voyons quelques questions sur la base de données et JDBC
Pour éviter les attaques par injection SQL, utilisez des requêtes paramétrées (instructions préparées) avec des paramètres liés, une validation d'entrée et des caractères d'échappement. Évitez les requêtes SQL dynamiques construites en concaténant les entrées de l'utilisateur.
La clause WHERE filtre les lignes avant le processus de regroupement et d'agrégation, tandis que la clause HAVING filtre les données agrégées après le processus de regroupement en fonction de conditions spécifiées.
Les transactions sont un ensemble d'instructions SQL exécutées comme une seule unité de travail. ACID est un acronyme pour Atomicity, Consistency, Isolation et Durability, qui sont des propriétés qui garantissent la fiabilité des transactions dans un système de base de données.
Les fonctions de fenêtre effectuent des calculs sur un ensemble de lignes liées à la ligne actuelle dans un ensemble de résultats de requête. Ils vous permettent d'exécuter des fonctions d'agrégation (telles que SUM, AVG, COUNT) sur une fenêtre spécifiée ou un sous-ensemble de lignes, défini par la clause OVER. Les fonctions de fenêtre fonctionnent sur un ensemble de lignes et renvoient une valeur unique pour chaque ligne en fonction de cet ensemble de lignes. Ils sont souvent utilisés pour des tâches telles que le classement, l'agrégation et le calcul des totaux cumulés.
Voir le livre Grokking the SQL Interview si vous avez besoin de plus de questions sur la base de données et SQL
Maintenant, il est temps de voir les questions d'Hibernate, l'un des frameworks Java les plus populaires :
Il est préférable d'utiliser du SQL brut lorsque :
En Java, une collection triée conserve les éléments dans un ordre spécifique défini par un comparateur ou par l'ordre naturel des éléments, tandis qu'une collection ordonnée conserve les éléments dans l'ordre dans lequel ils ont été insérés.
Le cache de deuxième niveau dans Hibernate stocke les objets dans une région de cache partagée, généralement sur plusieurs sessions. Lorsqu'une entité est interrogée pour la première fois, elle est extraite de la base de données et stockée dans le cache de deuxième niveau. Les requêtes ultérieures pour la même entité peuvent alors être satisfaites à partir du cache au lieu d'atteindre la base de données, améliorant ainsi les performances.
Les méthodes save() et persist() dans Hibernate sont utilisées pour enregistrer une entité dans la base de données. Cependant, save() renvoie immédiatement l'identifiant généré, tandis que persist() ne garantit pas l'exécution immédiate de l'instruction SQL INSERT ; il peut être exécuté plus tard pendant le temps de vidage. De plus, persist() fait partie de la spécification JPA, tandis que save() est spécifique à Hibernate.
Voyons maintenant les questions liées à l'architecture des microservices et aux services Web REST
SOAP est basé sur un protocole avec une structure rigide, tandis que REST est un style architectural basé sur une communication sans état avec des points de terminaison flexibles.
Il encapsule l'intégralité du message SOAP et définit sa structure.
Laksanakan SSL/TLS untuk penyulitan dan pengesahan.
Ia ialah data yang dihantar dalam kandungan permintaan atau respons HTTP.
Ia ialah gaya seni bina yang mana aplikasi terdiri daripada perkhidmatan kecil dan bebas.
Perkhidmatan mikro merujuk kepada reka bentuk seni bina, manakala REST ialah gaya seni bina untuk aplikasi rangkaian.
Monolitik mempunyai pangkalan kod tunggal, manakala Perkhidmatan Mikro mempunyai berbilang komponen bebas; Monolitik boleh mempunyai kependaman yang lebih tinggi.
Ia mengurus transaksi yang diedarkan dalam seni bina Microservices.
Ini adalah mekanisme untuk mencari perkhidmatan secara dinamik dalam seni bina Microservices.
Sebelum sebarang temu duga Java dan Spring Developer, saya selalu membaca Temuduga Grokking the Java dan Grokking the Spring boot
Berikut adalah beberapa lagi soalan daripada buku ini:
dan,
Dan, jika anda baru menggunakan Java maka anda juga boleh menyemak tapak seperti CodeGym, ZTM dan karpado untuk mempelajari Java dengan membina Permainan dan projek.
Terima kasih kawan-kawan buat masa ini. Anda boleh mencari jawapan dalam web dengan mudah tetapi jika ada minat yang mencukupi, saya juga boleh mengemas kini siaran itu. Beritahu saya jika anda juga pernah bertanya soalan ini sebelum ini. Jika ada yang tahu jawapan, boleh juga siarkan sebagai komen.
Semoga berjaya untuk Temuduga Java anda.
Dengan cara ini, jika anda baru dalam bahasa pengaturcaraan Java atau ingin meningkatkan kemahiran Java maka anda juga boleh menyemak mengikuti kursus Java terbaik untuk menjadi lebih baik:
Atas ialah kandungan terperinci Jawapan Soalan Temuduga Java untuk Latihan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!