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

Java 基礎面試題精選(二):日期時間、異常處理、集合框架、多執行緒、IO、XML、JDBC 進階

     編輯:Java 相關知識

本文為「Java 基礎面試題」系列第二部分,涵蓋日期時間 API(含 Java 8 新特性)、斷言、Error/Exception 差異、try-catch-finally 執行順序、異常處理最佳實踐、集合框架核心區別、泛型與 Comparable/Comparator、多執行緒基礎與進階(sleep/wait/yield、synchronized/Lock、執行緒池、狀態轉換)、序列化、IO 流體系、XML 解析、JDBC Statement/PreparedStatement、連接池、DAO 模式、事務 ACID 与隔離級別。內容深度適合中級開發者系統複習。


41-42. 日期時間處理(Java 7 vs Java 8)

需求Java 7 (Calendar)Java 8 (java.time)
取得年月日時分秒cal.get(Calendar.YEAR)...LocalDateTime.now().getYear()...
毫秒數 (1970 至今)Calendar.getInstance().getTimeInMillis()
System.currentTimeMillis()
Instant.now().toEpochMilli()
Clock.systemUTC().millis()
某月最後一天cal.getActualMaximum(Calendar.DAY_OF_MONTH)YearMonth.now().lengthOfMonth()
格式化日期SimpleDateFormat.format(date)DateTimeFormatter.ofPattern("yyyy-MM-dd").format(LocalDate.now())
昨天此刻cal.add(Calendar.DATE, -1)LocalDateTime.now().minusDays(1)

關鍵差異:Java 8 java.time 為不可變、執行緒安全,API 設計符合人類直覺,強烈建議新專案全面遷移。

43. Java vs JavaScript 本質差異

  • 歸屬:Java (Sun/Oracle) vs JavaScript (Netscape/ECMA)
  • 範式:Java = 靜態強型別、類別導向;JS = 動態弱型別、原型導向、函數為一等公民
  • 執行:Java 編譯為位元碼 → JVM 解譯/JIT;JS 直譯執行(現代引擎皆 JIT)
  • 核心差異:靜態 vs 動態語言。Java 8+ 引入 Lambda/函數式介面,開始擁抱函數式程式設計

44. 斷言 使用時機

  • 用於開發/測試階段驗證「絕對為真」的前提條件
  • 發布時關閉(-da),避免效能損耗
  • 兩種語法:assert expr;、assert expr : "詳細訊息";
  • 禁忌:斷言中不可包含改變程式狀態的邏輯(如 assert list.add(x))

45. Error vs Exception

  • Error:系統級錯誤(OutOfMemoryError、StackOverflowError),程式無法恢復,不應捕獲
  • Exception:程式邏輯可預期/可處理的異常,分受檢(編譯強制處理)與非受檢(RuntimeException)
  • 面試經典:StackOverflowError 最常見原因 = 遞歸無收斂條件

46. try-return-finally 執行順序

try { return 1; } finally { System.out.println("finally"); }

結果:先印 "finally",再返回 1。
原理:return 先將值暫存,執行 finally,最後返回暫存值。
大忌:在 finally 中修改返回值或拋出異常,會掩蓋原始返回/異常。Eclipse 可設為編譯錯誤。

47-48. 異常處理關鍵字與受檢/非受檢策略

  • try 監控區塊 → catch 捕獲特定型別 → finally 釋放資源
  • throw 拋出具體異常物件 → throws 宣告方法可能拋出的受檢異常
  • Effective Java 原則:
    1. 異常不用於正常控制流
    2. 可恢復情況用受檢異常,程式錯誤用運行時異常
    3. 優先使用標準異常
    4. 文檔化每個方法拋出的異常
    5. 保持異常原子性
    6. 切勿吞沒異常(空 catch 塊)

49. 常見 RuntimeException

ArithmeticException、ClassCastException、IllegalArgumentException、IndexOutOfBoundsException、NullPointerException、SecurityException

50. final / finally / finalize 三方辨析

關鍵字角色用途
final修飾符類不可繼承、方法不可覆寫、變數不可變(常量)
finally程式碼塊try-catch 後必執行區塊,釋放資源
finalizeObject 方法GC 回收前調用,整理資源(不建議依賴,Java 9 已標記棄用)

51. 異常捕獲順序與里氏替換

try { throw new ExampleB(); } // B 繼承 A 繼承 Exception
catch (ExampleA e) { ... }    // 會捕獲 B,因 B is-a A
catch (Exception e) { ... }   // 不會執行

原則:catch 順序必須子類在前,父類在後,否則編譯錯誤或永遠捕獲不到子類。

52-56. 集合框架核心對比

介面/類特徵底層結構執行緒安全
List有序、可重複、索引存取ArrayList(陣列) / LinkedList(雙向鏈表)否
Set無序、不可重複HashSet(HashMap) / TreeSet(紅黑樹)否
Map鍵值對、Key 不重複HashMap / TreeMap / Hashtable(舊)Hashtable 是
Vector舊版 List,方法 synchronized陣列是(效能差)
  • Collection 是介面;Collections 是工具類(排序、同步化、二分搜尋)
  • TreeSet/TreeMap 要求元素實作 Comparable 或傳入 Comparator
  • Collections.sort() 同理,支援策略模式注入比較器

57-67. 多執行緒核心(高頻考區)

sleep vs wait

特性sleep()wait()
所屬類別Thread (static)Object
鎖行為持有鎖不釋放釋放鎖,進入等待池
喚醒方式時間到自動notify()/notifyAll()
狀態轉換Running → Blocked → ReadyRunning → Wait Pool → Lock Pool → Ready

sleep vs yield

  • sleep:進入阻塞,給所有優先級機會,拋 InterruptedException
  • yield:進入就緒,僅給同/高優先級機會,不拋異常,可移植性較差

synchronized 方法互斥

執行緒進入物件的 synchronized 方法 A 後,同一物件的其他 synchronized 方法 B 無法進入(需同一把鎖)。僅能存取非同步方法。

同步輔助類

  • Lock (Java 5+):lock()/unlock() 手動控制,newCondition() 實現精確通知
  • Semaphore:控制同時存取共享資源的執行緒數(acquire/release)

三種建立執行緒方式

  1. 繼承 Thread
  2. 實作 Runnable(推薦,支援多重實作)
  3. 實作 Callable(Java 5+,call() 有返回值,配合 Future)

執行緒池

Executors 靜態工廠:

  • newSingleThreadExecutor:單執行緒序列執行
  • newFixedThreadPool(n):固定大小
  • newCachedThreadPool:動態伸縮,60s 空閒回收
  • newScheduledThreadPool:定時/週期任務

執行緒六大狀態

NEW → RUNNABLE → BLOCKED/WAITING/TIMED_WAITING → TERMINATED

執行緒狀態轉換圖

synchronized vs Lock

  • 相同:實現互斥同步
  • 不同:Lock 語義更精確、效能更好、可嘗試非阻塞獲取鎖、需手動 unlock(建議在 finally 中)

68-69. 序列化與 IO 流

  • 序列化:實作 Serializable(標記介面)→ ObjectOutputStream.writeObject() / ObjectInputStream.readObject()。用途:持久化、深度克隆、網路傳輸
  • IO 兩大體系:位元組流(InputStream/OutputStream)與字元流(Reader/Writer)
  • 兩大設計模式:適配器(InputStreamReader)與裝飾者(BufferedInputStream)

73-74. XML 解析

方式原理優點缺點適用場景
DOM整份文件載入記憶體建樹隨機存取、可修改記憶體佔用大、大檔案慢小檔案、需隨機存取
SAX事件驅動,順序讀取記憶體小、速度快唯讀、單向、需自行維護狀態大檔案、順序處理
StAX拉取式流處理記憶體小、程式主動控制API 較複雜大檔案、需隨機跳轉

實務推薦:dom4j(易用 API、XPath 支援、效能佳),Sun 官方 API 已棄用維護。

76-80. JDBC 進階與事務

主題關鍵點
PreparedStatement 優勢預編譯(防注入)、參數化、批次處理效能高(快取執行計畫)
提升讀取效能ResultSet.setFetchSize(n) 減少網路往返
提升更新效能addBatch() + executeBatch()
連接池作用避免頻繁建立/關閉連線開銷(TCP 三/四次握手),空間換時間
主流連接池C3P0、DBCP、Druid、HikariCP、BoneCP
DAO 模式Data Access Object:抽象資料存取介面,封裝持久化細節
事務 ACID原子性、一致性、隔離性、持久性
並發問題髒讀、不可重複讀、幻讀、第1/2類丟失更新
隔離級別READ_UNCOMMITTED < READ_COMMITTED < REPEATABLE_READ < SERIALIZABLE

事務隔離級別對照表

核心權衡:隔離級別越高,並發性能越差。無萬能最佳級別,需依業務場景選擇。


系列導航:Java 基礎面試題(一) | Java 基礎面試題(二) | Java 基礎面試題(三)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved