整理自實戰面經,涵蓋基礎語法、核心類庫、JVM 底層機制與設計模式應用。每題附帶解析與延伸知識點,適合面試複習與知識查漏補缺。
答案:start()、run()、getPriority()(exit() 屬於 System 類)
解析:start() 啟動新執行緒並呼叫 run();直接呼叫 run() 相當於普通方法調用,不具備多執行緒特性。
答案:繼承自 Throwable
延伸:Error(系統錯誤,不可恢復)與 Exception(程式異常,可捕獲)同繼承 Throwable。RuntimeException 及其子類為非受檢異常,其餘為受檢異常。
答案:是
解析:JVM 只有非守護執行緒存活時才運行;最後一個非守護執行緒結束,守護執行緒隨 JVM 退出。GC 是典型守護執行緒。
答案:不能
解析:volatile 僅保證可見性(讀取主記憶體最新值)與禁止指令重排序,無法保證複合操作原子性(如 count++)。需配合 synchronized、AtomicInteger 或鎖機制。
String str1 = "hello"; String str2 = "he" + new String("llo"); str1 == str2 結果?答案:false
解析:new String() 在堆中建立新物件,== 比較參考位址。字串常量池僅儲存字面值與編譯期常量表達式結果。
答案:能 四種方式:new、反射 Class.newInstance()/Constructor.newInstance()、clone()、反序列化 ObjectInputStream.readObject()。後兩者不調用建構函數。
ArrayList list = new ArrayList(20); 擴容幾次?答案:0 次
解析:指定初始容量 20,底層陣列一次分配足夠空間,添加 20 個元素不觸發擴容(預設 10 容量才會擴容)。
答案:LinkedList 實作 List、HashSet 繼承 AbstractSet
關鍵圖譜:Collection → List → ArrayList/LinkedList;Collection → Set → AbstractSet → HashSet/TreeSet;Map → HashMap/TreeMap(WeakHashMap 實作 Map,不繼承 HashMap)。
0.6332 的資料型別?答案:double
解析:浮點字面值預設為 double,float 需加 f 後綴(0.6332f)。
答案:InputStreamReader
口訣:Reader/Writer 為字元流,InputStream/OutputStream 為位元組流。BufferedReader 包裝 FileReader,ObjectInputStream 包裝 FileInputStream。
答案:final、abstract
解析:介面隱含 public abstract 方法與 public static final 常數。private/protected 違背介面公開契約;final 可修飾介面防止被繼承;abstract 為隱含修飾符。
i + 1 < i 成立的數嗎?答案:存在
解析:int 最大值 Integer.MAX_VALUE(2147483647)+1 溢位變負數。延伸:Double.NaN 使 i > j || i <= j 不成立。
? extends T 與 ? super T 差異?PECS 原則:Producer Extends(讀取用 extends)、Consumer Super(寫入用 super)。? extends Animal 可讀取 Animal 及子類,不可寫入;? super Dog 可寫入 Dog 及子類,讀取只能當 Object。
順序:父類靜態 → 子類靜態 → 父類構造區塊 → 父類建構子 → 子類構造區塊 → 子類建構子。
驗證程式碼:輸出 static A → static B → I'm A class → HelloA → I'm B class → HelloB。
答案:僅執行首個匹配區塊。FileNotFoundException 為 IOException 子類,若 catch IOException 在前,子類區塊不可達(編譯錯誤)。
答案:唯有值傳遞
鐵律:基本型別傳值副本;參考型別傳參考位址副本。**可修改物件內部狀態,不可改變參考指向新物件**。
答案:非 transient、非 static 的實例欄位。父類實作 Serializable 時,父類非 transient 實例欄位亦會序列化。
答案:DES、AES(DSA、RSA 為非對稱)。常見對稱:DES、3DES、RC2、RC4、AES;非對稱:RSA、DSA、ECC;單向雜湊:MD5、SHA。
答案:new BufferedReader(new FileInputStream(...))
解析:Reader 系列需包裝 Reader 子類(如 FileReader),不可直接包裝 InputStream。
Class.forName("com.mysql.jdbc.Driver") 作用?核心三點:① 反射檢查驅動類是否存在;② 觸發驅動類靜態區塊,向 DriverManager 註冊自身;③ 解耦合——程式碼不直接依賴具體驅動類,支援配置檔切換資料庫。
Scanner 中 next() 與 nextLine() 差異?next():以空白分隔,讀取下一個 Token,游標停在 Token 後。nextLine():讀取整行(含空白),游標移至下行行首。連用時 nextLine() 會讀到空行。
輸入 2 時,case 2、case 3 依序執行,結果 2 + 2*2 + 2*3 = 10。
答案:public abstract void method(int a); 抽象類可含抽象方法、非抽象方法、建構子、初始化區塊;不可含抽象建構子、抽象靜態方法。
若父類無無參建構子,子類必須顯式 super(...) 呼叫有參建構子,否則編譯失敗。
父子類同名私有欄位各自獨立;覆寫方法在父類建構子中調用時,執行子類版本,但子類欄位尚未初始化(預設值),導致輸出 null 或 0。
| 類別 | 核心口訣 |
|---|---|
| 異常體系 | Error 系統崩、Runtime 邏輯錯、Checked 外部錯 |
| 集合選型 | List 存序、Set 去重、Map 鍵值、Queue 排隊 |
| 執行緒安全 | 不可變最強、鎖次之、原子類再次、volatile 只保可見 |
| JVM 記憶體 | 堆共享、棧私有、方法區存類、程式計數器指令 |
| 設計模式 | 單例枚舉、工廠解耦、建造器多參、代理增強 |