Divulgation : cet article comprend des liens d'affiliation ; Je pourrai recevoir une compensation si vous achetez des produits ou services à partir des différents liens fournis dans cet article.
_
Bonjour les développeurs, vous préparez-vous pour des entretiens avec des développeurs Java ? Si oui, voici une liste de quelques questions d'entretien Java utiles pour les programmeurs Java expérimentés ayant une expérience de 2 à 5 ans.
En tant que développeur expérimenté, vous devez en apprendre davantage sur les concepts de POO, les bases de Java, le Framework Java Collection, les utilitaires multithreading et simultanés introduits dans Java 5 et 6, le débogage de l'application Java, l'algorithme et la structure des données. , Quelques questions sur les modèles de conception, la JVM et la collecte des déchets et quelques énigmes.
En fait, c'est un mélange de tout ce que vous faites dans votre travail quotidien.
Si vous recherchez un développeur Java ayant une certaine expérience dans le développement Web, vous serez également interrogé sur les frameworks Java populaires tels que Spring, Hibernate, Struts 2.0 et autres.
Si vous avez plus de 5 ans d'expérience, vous pouvez également vous attendre à des questions sur les outils de build comme Maven, ANT et Gradle, les meilleures pratiques Java, les tests unitaires et JUnit et votre expérience dans la résolution de problèmes de production.
L'une des questions les plus courantes auxquelles j'ai été confronté est de parler du dernier problème de production auquel vous avez été confronté et de la manière dont vous l'avez résolu.
Si on vous pose la même question, donnez-leur des détails étape par étape, depuis l'analyse du problème jusqu'à la solution tactique et la solution stratégique.
Dans cet article, je vais partager ma liste de questions d'entretien Java pour les gars Java ayant 2 à 5 ans d'expérience. Depuis que j'ai vécu une expérience similaire il y a quelques années, je sais quelles questions sont posées et garder une liste pour vous-même est toujours utile lorsque vous commencez à chercher un nouveau défi dans votre carrière.
Je ne fournis pas de réponses à ces questions dans cet article pour deux raisons, les questions sont assez simples et vous connaissez probablement la réponse, deuxièmement, fournir une réponse signifie que je ne peux pas utiliser cet article pour ma propre préparation plus tard, ce qui est plus important. .
Cependant, je pourrais écrire un autre article répondant à toutes ces questions si quelqu'un le demande ou si je sens que les gens en ont besoin.
À propos, si vous débutez dans le langage de programmation Java ou si vous souhaitez améliorer vos compétences en Java, vous pouvez également consulter des sites comme CodeGym, ZTM et karpado pour apprendre Java en créant des jeux et des projets.
Cette liste contient des questions sur différents sujets, par ex. Concepts POO, multi-threading et concurrence, collections Java, services Web, Spring, Hibernate, Database et JDBC, il ne couvre pas tous les sujets que vous devez préparer.
J'ajouterai quelques sujets plus tard quand j'aurai un peu de temps, pour l'instant, essayez de répondre à ces questions sans faire Google :)
Voici quelques questions sur la conception POO, le principe SOLID et les concepts de programmation de base
Le couplage lâche permet aux composants d'interagir les uns avec les autres avec des dépendances minimales, tandis que le couplage serré crée de fortes dépendances entre les composants.
La cohésion fait référence au degré d'appartenance des éléments d'un module, tandis que le couplage fait référence au degré d'interdépendance entre les modules.
Le principe de substitution de Liskov stipule que les objets d'une superclasse doivent être remplaçables par des objets de ses sous-classes sans affecter l'exactitude du programme.
Par exemple, si vous avez une hiérarchie de classes avec une superclasse « Shape » et des sous-classes « Circle » et « Square », toute méthode qui fonctionne avec Shape devrait également fonctionner avec Circle ou Square sans provoquer d'erreurs.
Les classes abstraites peuvent avoir à la fois des méthodes abstraites et concrètes, tandis que les interfaces ne peuvent avoir que des méthodes abstraites. De plus, une classe peut implémenter plusieurs interfaces mais ne peut étendre qu'une seule classe abstraite.
La composition implique une relation de propriété forte où la durée de vie de l'objet contenu dépend du conteneur.
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.
Une impasse 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 la base de données à partir du 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.
WHERE 子句在分組和聚合過程之前過濾行,而 HAVING 子句則根據指定條件過濾分組過程之後的聚合資料。
事務是作為單一工作單元執行的一組 SQL 語句。 ACID 是 Atomicity(原子性)、Consistency(一致性)、Isolation(隔離性)和 Durability(持久性)的縮寫,這些屬性確保資料庫系統中事務的可靠性。
視窗函數對查詢結果集中與目前行相關的一組行執行計算。它們可讓您對由 OVER 子句定義的指定視窗或行子集執行聚合函數(例如 SUM、AVG、COUNT)。視窗函數對一組行進行操作,並根據該行集為每行傳回一個值。它們通常用於排名、聚合和計算運行總計等任務。
如果您需要更多關於資料庫和 SQL 的問題,請參閱Grokking the SQL Interview 書籍
現在,是時候看看流行的 Java 框架之一 Hibernate 的問題了:
在下列情況下最好使用純 SQL:
在 Java 中,排序集合依照比較器或元素的自然排序定義的特定順序維護元素,而有序集合則會依照元素插入的順序來維護元素。
Hibernate 中的二級快取將物件儲存在共享快取區域中,通常跨多個會話。當一個實體第一次被查詢時,它會從資料庫中取出並儲存在二級快取中。對同一實體的後續查詢可以從快取中滿足,而不是存取資料庫,從而提高效能。
Hibernate 中的 save() 和 persist() 方法都用於將實體儲存到資料庫。然而,save() 立即傳回產生的標識符,而 persist() 不保證立即執行 SQL INSERT 語句;它可能會在稍後的刷新時間內執行。此外,persist() 是 JPA 規範的一部分,而 save() 是 Hibernate 特有的。
現在,讓我們來看看微服務架構和 REST Web 服務的問題
SOAP 是基於協定的、結構嚴格的,而 REST 是基於具有靈活端點的無狀態通訊的架構風格。
它封裝了整個 SOAP 訊息並定義了其結構。
實作 SSL/TLS 進行加密和驗證。
HTTP 請求或回應正文中傳輸的資料。
這是一種應用程式由小型獨立服務組成的架構風格。
微服務指的是架構設計,而REST則是網頁應用程式的架構風格。
單體具有單一程式碼庫,而微服務具有多個獨立的元件;單片可能有更高的延遲。
它管理微服務架構中的分散式事務。
它是在微服務架構中動態定位服務的機制。
在任何 Java 和 Spring 開發人員面試之前,我總是閱讀 Grokking the Java Interview 和 Grokking the Spring boot Interviw
以下是這些書中的更多問題:
並且,
而且,如果您是 Java 新手,那麼您還可以訪問 CodeGym、ZTM 和 karpado 等網站,透過建立遊戲和專案來學習 Java。
謝謝你們。您可以輕鬆地在網路上找到答案,但如果有足夠的興趣,我也可以更新帖子。如果您之前也問過這些問題,請告訴我。如果有人知道答案,也可以留言。
祝你 Java 面試順利。
順便說一句,如果您是 Java 程式語言新手或想要提高 Java 技能,那麼您也可以查看以下最佳 Java 課程來獲得更好的效果:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!