整理高頻 Java 面試題 60 道,涵蓋語言基礎、集合框架、異常處理、多線程併發、JVM 內存模型、Spring 生態、微服務架構、數據庫優化、設計模式、項目實戰。每題給出核心考點、標準答案要點、深度延伸方向,助你高效備戰。
final、finally、finalize 区别
final:修飾符。類不可繼承、方法不可重寫、變量不可修改 (引用不可變,對象內容可變)finally:異常處理塊,try-catch-finally 中無論是否異常均執行 (除 System.exit()),用於資源釋放finalize():Object 方法,GC 前調用,不可靠、性能差、JDK 9 棄用,替代方案:try-with-resources、CleanerString s = new String("xyz") 創建幾個對象?
String s = "xyz" 僅常量池 1 個;intern() 手動入池== vs equals() vs hashCode()
==:基本類型比值,引用類型比地址equals():Object 默認比地址,String/包裝類/集合重寫比內容hashCode():哈希碼契約:a.equals(b) → a.hashCode()==b.hashCode();反向不一定equals 必須重寫 hashCode,否則 HashMap/HashSet 失效int vs Integer,自動拆裝箱陷阱
int:基本類型,4 字節,默認 0,棧上存儲Integer:包裝類,對象,堆上存儲,默認 nullInteger 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 → falseswitch 支持類型演進
int、short、char、byte、enumStringlong、float、double、boolean 不支持重載 vs 重寫
| 維度 | 重載 | 重寫 |
|---|---|---|
| 位置 | 同一類內 | 父子類間 |
| 方法名 | 相同 | 相同 |
| 參數列表 | 不同 (類型/個數/順序) | 相同 |
| 返回類型 | 可不同 | 兼容 (子類型) |
| 拋出異常 | 無限制 | 子類異常 ⊆ 父類異常 |
| 訪問修飾符 | 無限制 | 子類 ≥ 父類 |
| 多態類型 | 編譯時 (靜態) | 運行時 (動態) |
Math.round(-11.5) 結果?
Math.round(float/double):floor(x + 0.5)round(11.5) = floor(12.0) = 12round(-11.5) = floor(-11.0) = -11 (非對稱)short s1 = 1; s1 = s1 + 1 報錯?s1 += 1 為何不報錯?
s1 + 1:short 提升為 int 運算,結果 int,需強轉賦值給 shorts1 += 1:隱含強轉,等價 s1 = (short)(s1 + 1)Java 有 goto 嗎?
break/continue 標籤、異常流程控制、結構化編程ArrayList vs LinkedList vs Vector
ArrayList:動態數組,隨機訪問 O(1),增刪 O(N),非線程安全LinkedList:雙向鏈表,隨機訪問 O(N),頭尾增刪 O(1),非線程安全,實現 DequeVector:同步 ArrayList,擴容 2x,性能差,棄用CopyOnWriteArrayListHashMap vs Hashtable vs ConcurrentHashMap
HashMap:非同步,允許 null key/value,JDK 8 鏈表+紅黑樹,擴容 2xHashtable:同步,不允許 null,擴容 2x+1,棄用ConcurrentHashMap:JDK 7 分段鎖,JDK 8 CAS+synchronized+紅黑樹,高併發首選HashMap 1.7 vs 1.8 核心變化
e.hash & (newCap - 1) == 0 判斷位置不變HashMap put 過程 (JDK 8)
hash(key),定位桶索引 (n-1) & hashkey.equals 匹配 → 覆蓋舊值size > thresholdConcurrentHashMap 1.7 vs 1.8
Segment 繼承 ReentrantLock,16 段鎖,HashEntry 鏈表Node 數組 + synchronized (頭節點) + CAS + 紅黑樹,粒度更細size():1.7 鎖段求和,1.8 LongAdder 累加 + baseCountArrayList 擴容機制
oldCapacity + (oldCapacity >> 1))ensureCapacity 可預分配避免多次擴容fail-fast vs fail-safe
fail-fast:modCount 機制,迭代中結構性修改拋 ConcurrentModificationException (ArrayList/HashMap)fail-safe:迭代副本/快照,不拋異常 (CopyOnWriteArrayList/ConcurrentHashMap)Comparable vs Comparator
Comparable:內部比較器,compareTo(this, other),實現類修改Comparator:外部比較器,compare(o1, o2),策略模式,多種排序規則Collections.sort(list) (需 Comparable) 或 list.sort(comparator)集合轉數組陷阱
List.toArray() 返回 Object[],不可強轉list.toArray(new String[0]) 或 list.toArray(new String[list.size()]) (JDK 11+ 推薦前者)Error vs Exception、受檢 vs 非受檢
Error:JVM 級災難 (OOM、StackOverflow),不可恢復,不捕獲Exception:程序邏輯可處理Exception 非 RuntimeException 子類,編譯強制處理 (IOException、SQLException)RuntimeException 子類,編譯不強制 (NPE、IndexOutOfBounds、ClassCast)throw vs throws
throw:方法體內拋出異常對象 throw new XxxException()throws:方法簽名聲明拋出異常類型 throws IOException, SQLExceptiontry-catch-finally 執行順序、return 影響
try 有 return → finally 執行 → 返回 try 保存的值finally 有 return → 覆蓋 try/catch 返回值 極不推薦System.exit() → finally 不執行sleep() vs wait()
sleep():Thread 靜態方法,釋放 CPU,**不釋放鎖**,指定時間後進入就緒態wait():Object 實例方法,**釋放鎖**,進入等待隊列,需 notify/notifyAll 喚醒InterruptedExceptionsynchronized 鎖升級 (JDK 1.6+)
volatile 可見性、有序性、不保證原子性
i++ 非原子,需 AtomicInteger 或 synchronized線程池 7 大參數、拒絕策略
corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handlerAbortPolicy(拋異常默認)、CallerRunsPolicy(調用者執行)、DiscardPolicy(丟棄)、DiscardOldestPolicy(丟棄最舊)ThreadLocal 內存洩漏原因、最佳實踐
ThreadLocalMap Key 為弱引用,Value 強引用 → Key 被 GC 後 Value 無法訪問但佔用內存static final ThreadLocal、用完 remove()、避免線程池場景不清理AQS 原理、共享/獨佔模式
state (volatile int) + FIFO 雙向隊列 + CASReentrantLock、Semaphore(信號量)、CountDownLatchReadWriteLock、CyclicBarrierJVM 內存結構 (JDK 8+)
對象創建、佈局、訪問定位
<init>對象死亡判定:可達性分析
四種引用強弱
Object o = new Object(),永不回收SoftReference,內存不足時回收,緩存場景WeakReference,GC 必回收,緩存/監聽器PhantomReference,無法獲取對象,跟蹤 GC 時機Finalize 可復活對象,但極不推薦
finalize() 中 this.ref = this 可復活,但只能一次,JDK 9 棄用垃圾收集算法:標記-清除、複製、整理、分代
主流收集器選型
GC 日誌分析關鍵指標
OOM 常見類型、排查工具
-Xmx 小 / 內存洩漏 → jmap -histo、MAT 分析 jmap -dump-XX:MaxMetaspaceSize-Xss-XX:MaxDirectMemorySize類加載機制:雙親委派、破壞雙親委派
IOC/DI 核心、Bean 生命週期
Aware 接口 → BeanPostProcessor 前置 → InitializingBean.afterPropertiesSet / @PostConstruct → BeanPostProcessor 後置 → 可用 → 銷毀前 DisposableBean.destroy / @PreDestroy循環依賴解決:三級緩存
singletonObjects (完成 Bean)earlySingletonObjects (早期暴露 Bean)singletonFactories (ObjectFactory,代理對象工廠)@Lazy 或重構)AOP 實現:JDK 動態代理 vs CGLIB
InvocationHandler,生成實現接口的匿名類MethodInterceptor,生成子類,最終類/方法不可代理proxyTargetClass=true (CGLIB)事務傳播行為、隔離級別、失效場景
REQUIRED(默認)、REQUIRES_NEW、NESTED、SUPPORTS...READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLESpring MVC 請求處理流程
DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → ModelAndView → ViewResolver → View 渲染Spring Boot 自動配置原理
@EnableAutoConfiguration → spring.factories 載入配置類 → @ConditionalOnClass/MissingBean/Property 條件裝配Spring Cloud 核心組件
@Transactional 失效 10 大場景
Spring 事件驅動、異步處理
ApplicationEvent + ApplicationListener + ApplicationEventPublisher@EventListener + @Async 異步事件備戰建議: