首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 程序員面試題精選:基礎、集合、多線程、JVM、Spring、微服務 60 題詳解

     編輯:Java 相關知識

整理高頻 Java 面試題 60 道,涵蓋語言基礎、集合框架、異常處理、多線程併發、JVM 內存模型、Spring 生態、微服務架構、數據庫優化、設計模式、項目實戰。每題給出核心考點、標準答案要點、深度延伸方向,助你高效備戰。

一、Java 語言基礎 (1-10)

  1. final、finally、finalize 区别

    • final:修飾符。類不可繼承、方法不可重寫、變量不可修改 (引用不可變,對象內容可變)
    • finally:異常處理塊,try-catch-finally 中無論是否異常均執行 (除 System.exit()),用於資源釋放
    • finalize():Object 方法,GC 前調用,不可靠、性能差、JDK 9 棄用,替代方案:try-with-resources、Cleaner
  2. String s = new String("xyz") 創建幾個對象?

    • 兩個:字符串常量池中 "xyz" (若無則創建) + 堆中 new String 實例
    • 補充:String s = "xyz" 僅常量池 1 個;intern() 手動入池
  3. == vs equals() vs hashCode()

    • ==:基本類型比值,引用類型比地址
    • equals():Object 默認比地址,String/包裝類/集合重寫比內容
    • hashCode():哈希碼契約:a.equals(b) → a.hashCode()==b.hashCode();反向不一定
    • 重寫 equals 必須重寫 hashCode,否則 HashMap/HashSet 失效
  4. int vs Integer,自動拆裝箱陷阱

    • int:基本類型,4 字節,默認 0,棧上存儲
    • Integer:包裝類,對象,堆上存儲,默認 null
    • 自動拆箱:Integer i = 10; int n = i; → i.intValue()
    • 自動裝箱:int n = 10; Integer i = n; → Integer.valueOf(n)
    • 陷阱:Integer a = 127; Integer b = 127; a==b → true (緩存 -128~127);Integer c = 200; Integer d = 200; c==d → false
  5. switch 支持類型演進

    • JDK 1.4-:int、short、char、byte、enum
    • JDK 7+:+ String
    • JDK 12+:Switch 表達式 (->、yield)、模式匹配 (JDK 17+)
    • long、float、double、boolean 不支持
  6. 重載 vs 重寫

    維度重載重寫
    位置同一類內父子類間
    方法名相同相同
    參數列表不同 (類型/個數/順序)相同
    返回類型可不同兼容 (子類型)
    拋出異常無限制子類異常 ⊆ 父類異常
    訪問修飾符無限制子類 ≥ 父類
    多態類型編譯時 (靜態)運行時 (動態)
  7. Math.round(-11.5) 結果?

    • Math.round(float/double):floor(x + 0.5)
    • round(11.5) = floor(12.0) = 12
    • round(-11.5) = floor(-11.0) = -11 (非對稱)
  8. short s1 = 1; s1 = s1 + 1 報錯?s1 += 1 為何不報錯?

    • s1 + 1:short 提升為 int 運算,結果 int,需強轉賦值給 short
    • s1 += 1:隱含強轉,等價 s1 = (short)(s1 + 1)
  9. Java 有 goto 嗎?

    • 保留字,未使用
    • 替代:break/continue 標籤、異常流程控制、結構化編程

二、集合框架 (11-20)

  1. ArrayList vs LinkedList vs Vector

    • ArrayList:動態數組,隨機訪問 O(1),增刪 O(N),非線程安全
    • LinkedList:雙向鏈表,隨機訪問 O(N),頭尾增刪 O(1),非線程安全,實現 Deque
    • Vector:同步 ArrayList,擴容 2x,性能差,棄用
    • 選型:隨機訪問多 → ArrayList;頭尾操作多 → LinkedList;併發 → CopyOnWriteArrayList
  2. HashMap vs Hashtable vs ConcurrentHashMap

    • HashMap:非同步,允許 null key/value,JDK 8 鏈表+紅黑樹,擴容 2x
    • Hashtable:同步,不允許 null,擴容 2x+1,棄用
    • ConcurrentHashMap:JDK 7 分段鎖,JDK 8 CAS+synchronized+紅黑樹,高併發首選
  3. HashMap 1.7 vs 1.8 核心變化

    • 數組+鏈表 → 數組+鏈表/紅黑樹 (鏈表長度 > 8 且數組長度 > 64 樹化)
    • 頭插法 → 尾插法 (避免擴容並發死循環)
    • 擴容機制優化:e.hash & (newCap - 1) == 0 判斷位置不變
  4. HashMap put 過程 (JDK 8)

    1. 計算 hash(key),定位桶索引 (n-1) & hash
    2. 桶為空 → 新建節點插入
    3. 桶非空 → 遍歷鏈表/樹,key.equals 匹配 → 覆蓋舊值
    4. 無匹配 → 尾插法鏈表/樹化判斷
    5. size++ → 擴容判斷 size > threshold
  5. ConcurrentHashMap 1.7 vs 1.8

    • 1.7:Segment 繼承 ReentrantLock,16 段鎖,HashEntry 鏈表
    • 1.8:放棄 Segment,Node 數組 + synchronized (頭節點) + CAS + 紅黑樹,粒度更細
    • size():1.7 鎖段求和,1.8 LongAdder 累加 + baseCount
  6. ArrayList 擴容機制

    • 默認容量 10,擴容 1.5 倍 (oldCapacity + (oldCapacity >> 1))
    • ensureCapacity 可預分配避免多次擴容
  7. fail-fast vs fail-safe

    • fail-fast:modCount 機制,迭代中結構性修改拋 ConcurrentModificationException (ArrayList/HashMap)
    • fail-safe:迭代副本/快照,不拋異常 (CopyOnWriteArrayList/ConcurrentHashMap)
  8. Comparable vs Comparator

    • Comparable:內部比較器,compareTo(this, other),實現類修改
    • Comparator:外部比較器,compare(o1, o2),策略模式,多種排序規則
    • 排序用 Collections.sort(list) (需 Comparable) 或 list.sort(comparator)
  9. 集合轉數組陷阱

    • List.toArray() 返回 Object[],不可強轉
    • 正確:list.toArray(new String[0]) 或 list.toArray(new String[list.size()]) (JDK 11+ 推薦前者)

三、異常與多線程 (21-30)

  1. Error vs Exception、受檢 vs 非受檢

    • Error:JVM 級災難 (OOM、StackOverflow),不可恢復,不捕獲
    • Exception:程序邏輯可處理
    • 受檢:Exception 非 RuntimeException 子類,編譯強制處理 (IOException、SQLException)
    • 非受檢:RuntimeException 子類,編譯不強制 (NPE、IndexOutOfBounds、ClassCast)
  2. throw vs throws

    • throw:方法體內拋出異常對象 throw new XxxException()
    • throws:方法簽名聲明拋出異常類型 throws IOException, SQLException
  3. try-catch-finally 執行順序、return 影響

    • try 有 return → finally 執行 → 返回 try 保存的值
    • finally 有 return → 覆蓋 try/catch 返回值 極不推薦
    • System.exit() → finally 不執行
  4. sleep() vs wait()

    • sleep():Thread 靜態方法,釋放 CPU,**不釋放鎖**,指定時間後進入就緒態
    • wait():Object 實例方法,**釋放鎖**,進入等待隊列,需 notify/notifyAll 喚醒
    • 均需捕獲 InterruptedException
  5. synchronized 鎖升級 (JDK 1.6+)

    • 無鎖 → 偏向鎖 (單線程) → 輕量級鎖 (CAS 自旋) → 重量級鎖 (OS 互斥量)
    • 鎖消除、鎖粗化、適應性自旋優化
  6. volatile 可見性、有序性、不保證原子性

    • 可見性:寫入立即刷新主存,讀取立即從主存加載
    • 有序性:禁止指令重排序 (內存屏障)
    • 不保證原子性:i++ 非原子,需 AtomicInteger 或 synchronized
  7. 線程池 7 大參數、拒絕策略

    • corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler
    • 拒絕策略:AbortPolicy(拋異常默認)、CallerRunsPolicy(調用者執行)、DiscardPolicy(丟棄)、DiscardOldestPolicy(丟棄最舊)
  8. ThreadLocal 內存洩漏原因、最佳實踐

    • ThreadLocalMap Key 為弱引用,Value 強引用 → Key 被 GC 後 Value 無法訪問但佔用內存
    • 最佳實踐:static final ThreadLocal、用完 remove()、避免線程池場景不清理
  9. AQS 原理、共享/獨佔模式

    • 核心:state (volatile int) + FIFO 雙向隊列 + CAS
    • 獨佔:ReentrantLock、Semaphore(信號量)、CountDownLatch
    • 共享:ReadWriteLock、CyclicBarrier

四、JVM 內存與 GC (31-40)

  1. JVM 內存結構 (JDK 8+)

    • 堆 (Heap):對象實例、數組,GC 主戰場,分代
    • 虛擬機棧:棧幀 (局部變量表、操作數棧、動態鏈接、返回地址)
    • 本地方法棧:Native 方法
    • 方法區:JDK 7 永久代 (PermGen),JDK 8+ 元空間 - 類元數據、常量、靜態變量、即時編譯代碼
    • 程序計數器:當前線程執行字節碼行號
  2. 對象創建、佈局、訪問定位

    • 創建:類加載檢查 → 分配內存 (指針碰撞/TLAB) → 初始化零值 → 設置對象頭 → 執行 <init>
    • 佈局:對象頭 (Mark Word、Klass Pointer、數組長度) + 實例數據 + 對齊填充
    • 訪問:句柄池 (reference→handle→instance) / 直接指針 (reference→instance,HotSpot 默認)
  3. 對象死亡判定:可達性分析

    • GC Roots:棧局部變量、靜態屬性、常量、JNI 引用、活線程、同步鎖、JVM 內部對象
    • 不可達 → 標記為垃圾
  4. 四種引用強弱

    • 強引用:Object o = new Object(),永不回收
    • 軟引用:SoftReference,內存不足時回收,緩存場景
    • 弱引用:WeakReference,GC 必回收,緩存/監聽器
    • 虛引用:PhantomReference,無法獲取對象,跟蹤 GC 時機
  5. Finalize 可復活對象,但極不推薦

    • finalize() 中 this.ref = this 可復活,但只能一次,JDK 9 棄用
  6. 垃圾收集算法:標記-清除、複製、整理、分代

    • 新生代:複製 (Eden→Survivor)
    • 老年代:標記-整理 / 標記-清除 (CMS)
    • G1/ZGC:區域化、混合算法
  7. 主流收集器選型

    • 吞吐量優先:Parallel Scavenge + Parallel Old
    • 低延遲:G1 (JDK 9+ 默認)、ZGC (JDK 11+)、Shenandoah
    • 小內存/單核:Serial
  8. GC 日誌分析關鍵指標

    • Young GC 頻率/耗時、Old GC 頻率/耗時、Full GC 觸發原因、分配速率、提升速率
  9. OOM 常見類型、排查工具

    • Heap OOM:-Xmx 小 / 內存洩漏 → jmap -histo、MAT 分析 jmap -dump
    • Metaspace OOM:類加載過多 / 動態代理 → -XX:MaxMetaspaceSize
    • StackOverflow:遞歸過深 / 線程棧小 → -Xss
    • Direct Memory OOM:NIO 直接內存 / Netty → -XX:MaxDirectMemorySize
  10. 類加載機制:雙親委派、破壞雙親委派

    • Bootstrap → Extension → Application → Custom
    • 破壞:JNDI (線程上下文類加載器)、Tomcat (WebappClassLoader 先自載)、OSGi、JDK 9+ 模塊化

五、Spring 生態 (41-50)

  1. IOC/DI 核心、Bean 生命週期

    • IOC:控制反轉,對象創建/依賴管理由容器負責
    • DI:依賴注入,構造器/Setter/字段注入
    • 生命週期:實例化 → 屬性填充 → Aware 接口 → BeanPostProcessor 前置 → InitializingBean.afterPropertiesSet / @PostConstruct → BeanPostProcessor 後置 → 可用 → 銷毀前 DisposableBean.destroy / @PreDestroy
  2. 循環依賴解決:三級緩存

    • 一級:singletonObjects (完成 Bean)
    • 二級:earlySingletonObjects (早期暴露 Bean)
    • 三級:singletonFactories (ObjectFactory,代理對象工廠)
    • 僅支持 Setter/字段注入構造器注入循環依賴無法解決 (需 @Lazy 或重構)
  3. AOP 實現:JDK 動態代理 vs CGLIB

    • JDK:接口代理,InvocationHandler,生成實現接口的匿名類
    • CGLIB:繼承目標類,MethodInterceptor,生成子類,最終類/方法不可代理
    • Spring Boot 2.x 默認 proxyTargetClass=true (CGLIB)
  4. 事務傳播行為、隔離級別、失效場景

    • 傳播:REQUIRED(默認)、REQUIRES_NEW、NESTED、SUPPORTS...
    • 隔離:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE
    • 失效:非 public 方法、內部調用 (this.xxx())、異常被捕獲未拋出、非受檢異常默認回滾、數據源無事務管理器
  5. Spring MVC 請求處理流程

    • DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → ModelAndView → ViewResolver → View 渲染
  6. Spring Boot 自動配置原理

    • @EnableAutoConfiguration → spring.factories 載入配置類 → @ConditionalOnClass/MissingBean/Property 條件裝配
  7. Spring Cloud 核心組件

    • 註冊中心:Nacos/Eureka/Consul
    • 配置中心:Nacos/Config Server
    • 網關:Gateway/Zuul
    • 熔斷:Sentinel/Resilience4j
    • 調用:OpenFeign/RestTemplate
    • 鏈路追蹤:Sleuth+Zipkin/SkyWalking
  8. @Transactional 失效 10 大場景

    • 方法非 public、內部調用、異常捕獲吞沒、拋出非受檢異常但配置 rollbackFor、數據源無事務管理器、引擎非 InnoDB、Bean 未被容器管理、@Transactional 放在接口且 CGLIB 代理、多線程調用、事務嵌套傳播行為錯誤
  9. Spring 事件驅動、異步處理

    • ApplicationEvent + ApplicationListener + ApplicationEventPublisher
    • @EventListener + @Async 異步事件

六、微服務、數據庫、設計模式、實戰 (51-60)

  1. CAP/BASE 理論:CAP 三選二 (分區容錯必選) → BASE (基本可用、軟狀態、最終一致)
  2. 分布式事務方案:2PC/3PC (同步阻塞)、TCC (補償)、Saga (事件驅動)、本地消息表、事務消息 (RocketMQ)、Seata AT 模式
  3. 一致性哈希、虛擬節點:解決節點增減數據遷移抖動
  4. Redis 常見數據結構、過期策略、穿透/擊穿/雪崩
  5. MySQL 索引原理 (B+ 樹)、最左前綴、回表、覆蓋索引、索引下推
  6. SQL 優化:Explain 關鍵字段、慢查詢分析、大表分頁優化
  7. 設計模式:單例 (雙重檢查)、工廠、策略、模板方法、觀察者、代理、建造者
  8. 項目難點:高併發、大數據、一致性、安全、性能優化具體方案
  9. 技術選型理由:為什麼選 G1/ZGC、為什麼選 Nacos、為什麼用 SXSSF
  10. 開放性問題:如何設計秒殺系統、如何保證接口幂等性、如何排查線上 CPU 100%

備戰建議:

  1. 按模塊專項突擊,每題能講清 原理、優缺點、選型理由、避坑經驗
  2. 準備 2-3 個 項目實戰案例,能串聯架構設計、技術難點、優化成果
  3. 關注 JDK 17/21 LTS 新特性、Spring Boot 3.x、虛擬線程、GraalVM 等前沿
  4. 代碼手寫:單例、LRU、生產消費、線程池、快排、二分查找
  5. 心態:面試是雙向選擇,展示解決問題思維勝過背誦答案
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved