Contents
1️⃣ 記事の目的と対象読者
このページは、Java エンジニアが面接で求められる知識を体系的に整理し、実務経験と合わせて自信を持って答えられるようになること を目指します。
- 転職・キャリアアップを考えている方
- Java 8 以降の機能や最新 LTS(Java 21)まで網羅したい方
- Spring Boot/マイクロサービス環境で実務経験がある方
2️⃣ 基礎概念の要点まとめ
| 項目 | キーワード | 面接で問われるポイント |
|---|---|---|
| OOP の四大原則 | カプセル化、継承、ポリモーフィズム、抽象化 | それぞれの意義と具体的なコード例を説明できるか |
| 型システム | 静的型付け、コンパイル時チェック、ジェネリクス | 型安全性のメリットとワイルドカード制約 (? extends T / ? super T) |
| 例外処理 | try‑catch‑finally、カスタム例外、チェック例外 vs ランタイム例外 |
例外階層設計やリソース解放のベストプラクティス |
コード例:ポリモーフィズムとカスタム例外
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
interface Payment { void pay(double amount); } class CreditCard implements Payment { public void pay(double amount) { /* カード決済ロジック */ } } class PayPal implements Payment { public void pay(double amount) { /* PayPal ロジック */ } } // カスタム例外 class InsufficientFundsException extends RuntimeException { public InsufficientFundsException(String msg) { super(msg); } } void process(Payment p, double amt) { if (amt < 0) throw new InsufficientFundsException("負の金額は不可"); p.pay(amt); } |
3️⃣ Java 8+ の関数型 API と実務活用例
| 機能 | 主な利点 | 実務での典型的な使い方 |
|---|---|---|
| Streams | 宣言的に集合操作が可能、並列化 (parallelStream) が容易 |
大量データのフィルタ・集計・統計算出 |
| Lambda 式 | 簡潔な匿名関数でコールバックを実装 | イベントリスナーや Comparator の定義 |
| Optional | null 安全性を型レベルで保証 |
API の戻り値で「存在しない」ケースを明示 |
実務コード例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
List<Order> orders = fetchOrders(); // 1. 売上10万円以上の注文だけ抽出 List<Order> bigOrders = orders.stream() .filter(o -> o.getTotal() > 100_000) .collect(Collectors.toList()); // 2. 合計金額を算出(並列化で高速化) double total = orders.parallelStream() .mapToDouble(Order::getTotal) .sum(); // 3. Optional を使った安全な取得 Optional<Customer> optCust = findCustomerById(id); String name = optCust.map(Customer::getName).orElse("Unknown"); |
4️⃣ 面接で頻出の質問と効果的な回答構成
4‑1️⃣ 基礎系(全員必須)
| 質問 | 回答の骨子 |
|---|---|
| Java の特徴は? | 「Write Once, Run Anywhere」←JVM がバイトコードを解釈し、OS に依存しない点を強調。 |
| OOP の四大原則を簡潔に説明せよ | 各原則の定義と、実務で意識した例(例:インターフェースでポリモーフィズム)を 30 秒以内に。 |
| Java 8 の新機能は何か? | Streams・Lambda・Default Method・Optional を列挙し、1 行ずつ実務での活用シーンを添える。 |
| record とは | 「不変データキャリア」←自動生成される equals/hashCode/toString と、DTO に使うメリットを述べる。 |
| Garbage Collection の仕組み | 世代別 GC(Young / Old)と代表的アルゴリズム(Serial, Parallel, G1, ZGC)の特徴を比較。 |
回答の型:結論 → 背景・理由 → 簡潔なコード例/図解
例:「G1 は Region 単位で部分的に回収するため、長時間停止が少ない」
4‑2️⃣ 実務志向・設計系(経験者向け)
| 質問 | 回答の構成例 |
|---|---|
| マイクロサービス間でデータ整合性を保つ方法 | 1. 従来の 2PC の課題 → 2. SAGA パターンで非同期補償トランザクションを実装、具体的な @Transactional 設定例を提示。 |
| Spring Boot 起動が遅い原因と対策 | Bean スキャン範囲の過剰 → @ComponentScan(basePackages = …) の絞り込み、spring.main.lazy-initialization=true で遅延ロード実装例。 |
| ConcurrentHashMap と synchronizedMap の違い | ロック粒度(分割ロック vs グローバルロック)とスケーラビリティの比較、実務での選択基準を述べる。 |
| REST API のエラーハンドリング設計 | @ControllerAdvice + カスタム例外 → HTTP ステータスコードとエラーレスポンス JSON の統一例。 |
| Virtual Threads (Project Loom) を導入したケース | 大量 I/O タスクで従来の 1,000 Thread が 10,000 に増えても CPU 使用率が低減、Thread.startVirtualThread(() -> …) のサンプルコード。 |
ポイント:課題 → アプローチ(設計・実装) → 得られた効果(数値やチームへのインパクト) を STAR 形式で語る。
4‑3️⃣ 最新言語機能(Java 17/21)
| 機能 | 面接で狙われる観点 |
|---|---|
| record | 不変オブジェクトの簡易定義、equals/hashCode 自動生成 |
| Pattern Matching for instanceof | 型キャスト不要のシンプル記法 if (obj instanceof String s) { … } |
| Sealed Classes | 継承階層を制限し、安全な API 設計が可能 |
| Virtual Threads | 従来スレッドと比べたスケーラビリティ、Loom の実装ステータス(プレビュー) |
参考:Oracle JEP 395 (Records)、JEP 406 (Pattern Matching)、JEP 409 (Sealed Classes) など公式ドキュメント。
5️⃣ JVM メモリモデルとガベージコレクション
5‑1️⃣ メモリ領域の概要
| 領域 | 主な役割 |
|---|---|
| Method Area (Metaspace) | クラス定義、静的変数 |
| Heap | オブジェクト実体(Young / Old 世代) |
| Stack | スレッドごとのフレーム、ローカル変数 |
| Native Method Stack | JNI 呼び出し用スタック |
| Program Counter (PC) Register | 現在実行中のバイトコードアドレス |
5‑2️⃣ 主な GC アルゴリズムと選択指標
| アルゴリズム | 特徴 | 適用シーン例 |
|---|---|---|
| Serial | 単一スレッドで停止、ヒープが小さい環境向き | 開発・テスト環境 |
| Parallel (Throughput) | 複数スレッドで同時回収、スループット重視 | バッチ処理系 |
| CMS | 短い停止時間を目指すが CPU 使用率高め | レイテンシ要求の Web アプリ |
| G1 | Region 単位で部分的に回収、バランス良好 | 大規模サービス全般 |
| ZGC / Shenandoah | 低遅延(ミリ秒単位)を実現、ヒープが数十 GB でも可 | 超大規模リアルタイムシステム |
面接での答え方例
「System.gc()を明示的に呼び出すのは、JVM の最適化を阻害しパフォーマンス低下につながるため、基本的には避けます。」
6️⃣ 並行処理 API と実務活用
6‑1️⃣ CompletableFuture 基本パターン
|
1 2 3 4 5 6 7 8 |
CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> fetchData()) .thenApply(data -> process(data)) .exceptionally(ex -> "fallback"); // エラーファイルバック // 複数タスクの同時待ち CompletableFuture<Void> all = CompletableFuture.allOf(cf1, cf2, cf3); all.join(); // 全タスク完了までブロック |
6‑2️⃣ ForkJoinPool と大規模並列計算
|
1 2 3 4 5 6 7 |
ForkJoinPool pool = new ForkJoinPool(); long sum = pool.submit(() -> LongStream.rangeClosed(1, 10_000_000) .parallel() .sum() ).join(); |
6‑3️⃣ Virtual Threads(プレビュー)
|
1 2 3 4 5 6 7 8 |
try (var executor = Thread.ofVirtual().factory()) { CompletableFuture<Void> cf = CompletableFuture.runAsync(() -> { // I/O 待ちが多い処理 httpClient.send(request); }, executor); cf.join(); } |
面接で語るべき点
- CompletableFuture は非同期フローと例外合成が得意 → 失敗時のフォールバック戦略
- ForkJoinPool は分割統治アルゴリズムに最適 → タスク粒度とスレッド数調整が鍵
- Virtual Threads は「1 スレッドで多数 I/O 待ち」を解決し、コードは従来の Thread とほぼ同様
7️⃣ Spring Boot / マイクロサービス実務例
| トピック | 典型的な課題と対処法 |
|---|---|
| BeanCreationException | スタックトレースから原因を特定 → @ComponentScan の範囲や @ConditionalOnMissingBean を確認 |
| 外部設定管理 (Spring Cloud Config) | Git リポジトリにプロパティ保存、bootstrap.yml で読み込み、@RefreshScope により動的再読込 |
| サーキットブレーカー | Resilience4j の CircuitBreaker を導入し、fallback メソッドで代替応答を提供 |
| モニタリング & デバッグ | Actuator エンドポイント (/actuator/metrics) と Micrometer → Prometheus + Grafana で可視化 |
コード例:Resilience4j のサーキットブレーカー
|
1 2 3 4 5 6 7 8 9 |
@CircuitBreaker(name = "orderService", fallbackMethod = "fallback") public Order getOrder(Long id) { return restTemplate.getForObject("/orders/{id}", Order.class, id); } public Order fallback(Long id, Throwable t) { // デフォルトオーダーを返す return new Order(id, "default"); } |
8️⃣ 行動面・チームフィット質問の回答テクニック(STAR 法)
| 質問例 | STAR の構成例 |
|---|---|
| デッドライン直前にパフォーマンス問題が発覚 | S:バッチ処理が 30 %遅延 T:原因特定と改善 A:JProfiler でヒープ分析、 parallelStream に置換R:処理時間 45 %短縮、リリース成功 |
| 新人エンジニアのコード品質向上 | S:PR コメントが多い T:コーディング規約統一 A:ペアプログラミングと Checkstyle 導入 R:コメント数 60 %削減 |
| API 契約のずれを解消 | S:複数チームで API バージョンが不一致 T:契約統一 A:OpenAPI で仕様書生成、CI にスキーマ検証追加 R:リリース後の不整合バグゼロ |
ポイント:具体的な数値やツール名を入れると説得力が増します。
9️⃣ 学習ロードマップ & 次のアクション
| フェーズ | 主な学習項目 | 推奨アウトプット |
|---|---|---|
| ① 基礎固め (1‑2 週) | OOP・例外処理・Java 8 API | 各概念を 5 分程度で説明できるスライド作成 |
| ② JVM & 並行処理 (2‑3 週) | メモリモデル、GC 選択基準、CompletableFuture/Virtual Threads |
小規模プロジェクトで非同期 API を実装し、ベンチマーク結果をレポート |
| ③ Spring Boot 実務 (4‑5 週) | 設定トラブル診断、Resilience4j、Actuator | 本番環境に近いサンプルアプリで「起動遅延」→「改善」までの手順ドキュメント化 |
| ④ 行動質問練習 (随時) | STAR 法で過去プロジェクトを 3 件整理 | 模擬面接でパートナーとロールプレイし、フィードバックを受ける |
最終チェック:上記すべての項目について「質問 → キーワード → コード例/実務経験」の形で答えられるか自己評価シートを作成すると、本番での落ち着きが格段に向上します。
参考リンク(信頼できる公式情報)
| 内容 | URL |
|---|---|
| Java 言語仕様・JDK ドキュメント | https://docs.oracle.com/en/java/javase/ |
| JEP(新機能)一覧(record, pattern matching, sealed classes 等) | https://openjdk.org/jeps/ |
| Spring Boot 公式ガイド | https://spring.io/projects/spring-boot |
| Resilience4j 公式ドキュメント | https://resilience4j.readme.io/ |
| Micrometer & Actuator | https://micrometer.io/docs |
まとめ
1. 基礎から最新機能まで網羅的に学び、コードで実装経験を積む。
2. JVM と GC の内部構造、並行処理 API の特徴を「何ができて、どんな場面で選ぶか」レベルで語れるようにする。
3. Spring Boot 系のトラブルシューティングとマイクロサービス設計パターンは実務例を交えて説明できること。
4. 行動質問は STAR 法で構造化し、数値やツール名で具体性を持たせる。
このロードマップに沿って学習すれば、次回の Java 面接で 技術的深さと実務経験の両方 をバランス良くアピールできるはずです。ぜひ今日から手を付けてみましょう!