공개: 이 게시물에는 제휴사 링크가 포함되어 있습니다. 본 글에 제공된 다른 링크를 통해 제품이나 서비스를 구매하실 경우 보상을 받으실 수 있습니다.
_
안녕하세요 개발자 여러분, Java 개발자 인터뷰를 준비하고 계신가요? 그렇다면, 여기에 2~5년의 경험을 가진 숙련된 Java 프로그래머를 위한 유용한 Java 인터뷰 질문 목록이 있습니다.
숙련된 개발자라면 OOP 개념, Java 기본 사항, Java 컬렉션 프레임워크, Java 5 및 6에 도입된 멀티스레딩 및 동시성 유틸리티, Java 애플리케이션 디버깅, 알고리즘 및 데이터 구조에 대해 배우게 됩니다. , 디자인 패턴, JVM 및 가비지 수집 및 몇 가지 퍼즐에 대한 몇 가지 질문입니다.
실제로 일상 업무에서 수행하는 모든 작업이 혼합되어 있습니다.
웹 개발에 대한 경험이 있는 Java 개발자를 찾고 있다면 Spring, Hibernate, Struts 2.0 등과 같은 인기 있는 Java 프레임워크에 대해서도 질문을 받게 될 것입니다.
5년 이상의 경력이 있는 경우 Maven, ANT 및 Gradle과 같은 빌드 도구, Java 모범 사례, 단위 테스트 및 JUnit, 프로덕션 문제 해결에 대한 경험에 대한 질문도 기대할 수 있습니다.
제가 직면한 가장 일반적인 질문 중 하나는 지난번에 직면했던 생산 문제와 이를 어떻게 해결했는지에 대한 것입니다.
같은 질문을 받으면 문제 분석부터 전술적 해결, 전략적 해결까지 단계별로 자세히 알려주세요.
이번 글에서는 2~5년 경력의 Java 전문가를 위한 Java 면접 질문 목록을 공유하겠습니다. 저는 몇 년 전에 비슷한 경험을 했기 때문에 어떤 질문을 받는지 알고 있으며, 자신만의 목록을 보관해 두는 것은 경력에서 새로운 도전을 시작할 때 항상 도움이 됩니다.
두 가지 이유로 이 게시물에서 이 질문에 대한 답변을 제공하지 않습니다. 질문은 매우 간단하며 여러분은 아마도 답변을 알고 있을 것입니다. 두 번째 답변을 제공한다는 것은 나중에 이 게시물을 자체 준비에 사용할 수 없다는 것을 의미하며 이는 더 중요합니다. .
하지만 누군가 요청하거나 필요하다고 생각되면 이 모든 질문에 답하는 또 다른 기사를 작성할 수 있습니다.
그런데, Java 프로그래밍 언어가 처음이거나 Java 기술을 향상시키고 싶다면 CodeGym, ZTM 및 karpado와 같은 사이트에서 게임과 프로젝트를 구축하여 Java를 배울 수도 있습니다.
이 목록에는 다양한 주제의 질문이 포함되어 있습니다. OOP 개념, 멀티스레딩 및 동시성, Java 컬렉션, 웹 서비스, Spring, Hibernate, 데이터베이스 및 JDBC 등 준비해야 할 모든 주제를 다루지는 않습니다.
나중에 시간이 나면 몇 가지 주제를 더 추가하겠습니다. 지금은 Google을 검색하지 않고 이 질문에 답해 보세요. :)
다음은 OOP 디자인, SOLID 원칙 및 기본 프로그래밍 개념에 대한 몇 가지 질문입니다
느슨한 결합을 통해 구성 요소는 최소한의 종속성으로 서로 상호 작용할 수 있는 반면, 긴밀한 결합은 구성 요소 간에 강한 종속성을 생성합니다.
결합성은 모듈 내 요소들이 서로 속해 있는 정도를 의미하고, 결합성은 모듈 간의 상호의존성 정도를 의미합니다.
Liskov 대체 원칙은 프로그램의 정확성에 영향을 주지 않고 슈퍼클래스의 객체를 하위 클래스의 객체로 대체할 수 있어야 한다는 것입니다.
예를 들어, 슈퍼 클래스 "Shape"와 하위 클래스 "Circle" 및 "Square"가 있는 클래스 계층 구조가 있는 경우 Shape와 함께 작동하는 모든 메소드는 오류 없이 Circle 또는 Square에서도 작동해야 합니다.
추상 클래스에는 추상 메서드와 구체적인 메서드가 모두 있을 수 있지만 인터페이스에는 추상 메서드만 있을 수 있습니다. 또한 클래스는 여러 인터페이스를 구현할 수 있지만 하나의 추상 클래스만 확장할 수 있습니다.
구성은 포함된 개체의 수명이 컨테이너에 따라 달라지는 강력한 소유권 관계를 의미합니다.
집계는 포함된 개체가 컨테이너와 독립적으로 존재할 수 있는 약한 관계를 의미합니다. 연관은 소유권이나 수명 주기 종속성이 없는 두 클래스 간의 관계를 의미합니다.
이제 컬렉션 및 스트림에 대한 몇 가지 질문을 살펴보겠습니다
목록은 요소를 순차적으로 유지하고 중복을 허용합니다(예: ArrayList, LinkedList). 세트는 중복을 허용하지 않으며 순서를 보장하지 않습니다(예: HashSet, TreeSet). 맵은 키-값 쌍을 저장하며 중복 키(예: HashMap, TreeMap)를 허용하지 않습니다.
동기화된 컬렉션은 스레드 안전성을 확보하기 위해 명시적 잠금을 사용하므로 한 번에 하나의 스레드만 컬렉션을 수정할 수 있습니다. 동시 컬렉션은 비차단 알고리즘을 사용하며 높은 동시성을 위해 설계되어 명시적인 잠금 없이 여러 스레드가 컬렉션을 동시에 수정할 수 있습니다.
HashMap의 get 메소드는 제공된 키의 해시 코드를 계산하고, 해시 코드를 기반으로 기본 배열의 인덱스를 결정한 다음 해당 인덱스에서 키를 검색합니다. 발견되면 해당 값을 반환합니다. 그렇지 않으면 null을 반환합니다.
ConcurrentHashMap은 차단 없이 맵에 대한 동시 액세스를 허용하는 반면, Hashtable은 동기화된 방법을 사용하여 스레드 안전성을 달성하므로 잠재적인 성능 병목 현상이 발생합니다. ConcurrentHashMap은 맵을 각각 잠금 기능이 있는 세그먼트로 나누어 여러 스레드가 서로 다른 세그먼트를 동시에 수정할 수 있도록 함으로써 스레드 안전성을 달성합니다.
LinkedList는 어느 위치에서나 일정한 시간 삽입 및 삭제를 제공하므로 빈번한 삽입 및 삭제 작업이 필요한 경우 LinkedList를 사용하십시오. ArrayList는 인덱스별로 상시 액세스를 제공하므로 랜덤 액세스와 반복이 빈번할 때 ArrayList를 사용하세요.
이제 Java 멀티스레딩 및 동시성 개념에 대한 질문을 볼 시간입니다.
notify와 informAll은 모두 모니터에서 대기 중인 스레드를 깨우는 데 사용되는 Java의 메소드입니다(즉, 객체의 잠금을 획득하기 위해 대기 중). 통지는 무작위로 선택된 하나의 스레드를 깨우고, 통지All은 대기 중인 모든 스레드를 깨웁니다. informAll은 대기 중인 모든 스레드에 알림을 보내 잠재적인 무기한 대기를 방지하고 시스템 응답성을 향상시키기 때문에 선호됩니다.
경합 조건은 프로그램의 결과가 여러 스레드의 타이밍이나 인터리브에 따라 달라질 때 발생합니다. 경쟁 조건을 방지하려면 잠금, 세마포어 또는 원자성 작업과 같은 동기화 메커니즘을 사용하여 코드의 중요 섹션이 원자적으로 또는 한 번에 하나의 스레드에 의해서만 실행되도록 할 수 있습니다.
교착 상태는 두 개 이상의 스레드가 서로 진행해야 하는 리소스를 해제할 때까지 기다리면서 멈춰 있을 때 발생합니다. 교착 상태를 방지하려면 리소스 순서 지정, 중첩 잠금 방지 또는 잠금 획득을 위한 시간 제한 사용과 같은 기술을 사용할 수 있습니다. 또한 명확하고 일관된 잠금 순서로 코드를 설계하면 교착 상태를 방지하는 데 도움이 될 수 있습니다.
java.util.concurrent에서 제공하는 일부 고급 동시성 클래스에는 ExecutorService, ThreadPoolExecutor, CountDownLatch, Semaphore, CyclicBarrier, BlockingQueue 및 ConcurrentHashMap이 포함됩니다. 이러한 클래스는 스레드 풀, 동기화 프리미티브 및 동시 데이터 구조와 같은 일반적인 동시성 패턴 및 메커니즘을 스레드로부터 안전하게 구현합니다.
예, 코드는 다음과 같습니다.
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는 Java 프로그램에서 데이터베이스를 연결하는 데 사용됩니다. 데이터베이스와 JDBC에 대해 몇 가지 질문을 살펴보겠습니다
SQL 주입 공격을 방지하려면 바인딩된 매개변수, 입력 유효성 검사 및 이스케이프 문자가 포함된 매개변수화된 쿼리(준비된 문)를 사용하세요. 사용자 입력을 연결하여 생성된 동적 SQL 쿼리를 피하세요.
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.
Implémentez SSL/TLS pour le cryptage et l'authentification.
Ce sont les données transmises dans le corps de la requête ou de la réponse HTTP.
C'est un style architectural où les applications sont composées de petits services indépendants.
Les microservices font référence à la conception architecturale, tandis que REST est un style architectural pour les applications en réseau.
Monolithic a une base de code unique, tandis que les microservices ont plusieurs composants indépendants ; Le monolithique peut avoir une latence plus élevée.
Il gère les transactions distribuées dans une architecture de microservices.
C'est le mécanisme de localisation dynamique des services au sein d'une architecture de microservices.
Avant tout entretien avec un développeur Java et Spring, je lis toujours l'interview Grokking the Java et l'interviw Grokking the Spring boot
Voici quelques questions supplémentaires tirées de ces livres :
et,
Et si vous êtes nouveau sur Java, vous pouvez également consulter des sites comme CodeGym, ZTM et karpado pour apprendre Java en créant des jeux et des projets.
Merci les gars pour l'instant. Vous pouvez facilement trouver les réponses sur le Web, mais s'il y a suffisamment d'intérêt, je peux également mettre à jour le message. Faites-moi savoir si vous avez également déjà posé ces questions. Si quelqu'un connaît la réponse, il peut également la poster en commentaire.
Bonne chance pour votre entretien Java.
À propos, si vous êtes nouveau dans le langage de programmation Java ou si vous souhaitez améliorer vos compétences en Java, vous pouvez également consulter les meilleurs cours Java suivants pour vous améliorer :
위 내용은 연습용 Java 면접 질문 답변의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!