
簡介這是一份面向Java初學者與應(yīng)屆培訓生的面試復習文檔圍繞初級崗位常見考點整理出208道試題并附參考答案幫助缺乏項目經(jīng)驗的求職者快速建立知識框架、應(yīng)對技術(shù)面試。資源為單個docx文件壓縮包約155KB內(nèi)容按十八個模塊編排涵蓋Java基礎(chǔ)、多線程、反射、對象拷貝、JavaWeb、異常、網(wǎng)絡(luò)、設(shè)計模式、Spring/Spring MVC、Spring Boot/SpringCloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis與JVM等方向。其中Java基礎(chǔ)部分對JDK與JRE的區(qū)別、與equals的差異、hashCode與equals的關(guān)系、final關(guān)鍵字作用、Math.round取值規(guī)則等高頻題給出了代碼示例與逐行解讀便于理解底層原理。目前已有620人學習適合作為面試前的速查清單與知識點查漏補缺之用。1. 初級 Java 崗面試208 道題里真正拉開差距的只有這四類初級 Java 面試有個反直覺的地方面試官手里那張題庫和你背的那份往往不是同一套。你背了 208 道他可能只問 12 道但這 12 道里有一半會順著你的回答往下追。真正拉開差距的不是你背了多少而是你能不能在被追問時穩(wěn)住。這份 Java 初級面試題匯總按十八個模塊拆開從 Java 基礎(chǔ)、多線程、反射、對象拷貝一路鋪到 JavaWeb、異常、網(wǎng)絡(luò)、設(shè)計模式再到 Spring/Spring MVC、Spring Boot/SpringCloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM一共 208 道。它面向的是剛從學校出來或者剛培訓出來的 Java 人員所以題目難度壓在初級區(qū)間但覆蓋面鋪得很寬。問題也在這里覆蓋面寬不等于每道都要背到一字不差。初級崗面試的評分邏輯是「基礎(chǔ)題不能錯進階題能說個大概場景題能接住追問」。下面按考點分布、高頻模塊、易錯點、答題技巧四層往下拆你照著練就行。2. 考點分布十八個模塊里哪幾個決定你能不能過2.1 先看清分值地圖別把時間平攤十八個模塊聽起來嚇人但初級崗面試的時間分配極不均勻。按實際面試出現(xiàn)頻率排Java 基礎(chǔ)、多線程、集合、異常這四塊能占到一半以上的提問量Spring/Spring MVC、MySQL、Redis 再占掉兩成剩下的反射、對象拷貝、JavaWeb、網(wǎng)絡(luò)、設(shè)計模式、消息隊列、Zookeeper、JVM 屬于「問到就答答不上來不致命」的區(qū)間。所以備考順序不是從模塊一背到模塊十八而是先把 Java 基礎(chǔ)和多線程吃透再補 Spring 和數(shù)據(jù)庫最后掃一遍邊角模塊。下面這張表幫你判斷每個模塊該投入多少精力。模塊面試出現(xiàn)頻率建議投入典型問法Java 基礎(chǔ)極高精背 能寫代碼 和 equals、String 類、抽象類與接口多線程極高精背 理解原理線程創(chuàng)建、線程池、synchronized、死鎖集合高精背 對比記憶HashMap 原理、ArrayList 與 LinkedList異常高理解分類受檢與非受檢、try-catch-finallySpring/Spring MVC高理解流程IOC、AOP、請求處理流程MySQL高理解 會寫 SQL索引、事務(wù)、鎖Redis中高理解場景數(shù)據(jù)類型、緩存穿透、持久化反射、對象拷貝中知道概念反射機制、淺拷貝與深拷貝JavaWeb、網(wǎng)絡(luò)中知道概念HTTP、TCP、Servlet 生命周期設(shè)計模式中記住幾個常用的單例、工廠、代理消息隊列、Zookeeper低知道用途解耦、削峰、分布式協(xié)調(diào)JVM中理解內(nèi)存結(jié)構(gòu)內(nèi)存區(qū)域、GC、類加載這張表的意思是如果你的準備時間只有兩周前四行必須滾瓜爛熟中間幾行能說出關(guān)鍵詞最后幾行知道它是干什么的就行。面試官不會因為你說不清 Zookeeper 的選舉算法就否定你但會因為你說錯 HashMap 的擴容機制而皺眉。2.2 真題演練基礎(chǔ)模塊的三道必考題題一JDK 和 JRE 有什么區(qū)別這題看著簡單但很多人答得含糊。答題思路是分三層說第一層說全稱和定位JDK 是 Java Development Kit開發(fā)工具包提供開發(fā)和運行環(huán)境JRE 是 Java Runtime Environment運行環(huán)境只負責運行。第二層說包含關(guān)系JDK 里面包含了 JRE同時還帶了編譯器 javac 以及一堆調(diào)試分析工具。第三層落到使用場景只運行 Java 程序裝 JRE 就夠要寫 Java 程序必須裝 JDK。面試官最想聽的是第三層因為前兩層誰都會背能說清「什么時候用哪個」才說明你真理解。題二 和 equals 的區(qū)別是什么這題必須分基本類型和引用類型說混在一起說就是翻車現(xiàn)場?;绢愋陀? 比較的是值是否相同引用類型用 比較的是引用是否指向同一個對象。equals 默認情況下就是 但 String、Integer 這些類重寫了 equals把它變成了值比較。能配上代碼說更好String x string; String y string; String z new String(string); System.out.println(x y); // true指向常量池同一引用 System.out.println(x z); // falsenew 開辟了新堆內(nèi)存 System.out.println(x.equals(y)); // true值相同 System.out.println(x.equals(z)); // true值相同代碼后面的解讀要跟上x 和 y 都指向常量池里的同一個對象所以 為 truez 通過 new 在堆上開了新空間引用不同所以 為 falseequals 被 String 重寫成值比較所以兩個都是 true。這段代碼加解讀基本能拿滿分。題三兩個對象的 hashCode() 相同equals() 也一定為 true 嗎答案是「不一定」。這題考的是你對散列表的理解。hashCode 相同只說明兩個鍵值對的哈希值相等但哈希值相等不代表對象相等。經(jīng)典例子是「通話」和「重地」這兩個字符串它們的 hashCode 都是 1179395但 equals 返回 false。答題時補一句反過來如果 equals 為 truehashCode 一定相同這是重寫 equals 時必須遵守的約定。能說出這個反向約定面試官會覺得你基礎(chǔ)扎實。3. 多線程高頻考點線程池、鎖升級、死鎖三道硬菜3.1 線程池七種創(chuàng)建方式核心只有一種多線程模塊里線程池是必問的。這份題庫列了七種創(chuàng)建方式newSingleThreadExecutor、newCachedThreadPool、newFixedThreadPool、newSingleThreadScheduledExecutor、newScheduledThreadPool、newWorkStealingPool以及最原始的 ThreadPoolExecutor。前六種都是對 ThreadPoolExecutor 的封裝所以答題時先說這句再展開各自特點。newSingleThreadExecutor 工作線程數(shù)為 1保證任務(wù)順序執(zhí)行newCachedThreadPool 處理大量短時任務(wù)線程閑置超過 60 秒就回收內(nèi)部用 SynchronousQueuenewFixedThreadPool 固定線程數(shù)超出任務(wù)在無界隊列等待newScheduledThreadPool 支持定時和周期調(diào)度newWorkStealingPool 是 Java 8 加入的內(nèi)部構(gòu)建 ForkJoinPool用 Work-Stealing 算法并行處理不保證順序。面試官追問「為什么阿里規(guī)范不建議用 Executors 創(chuàng)建線程池」你要能接住newFixedThreadPool 和 newSingleThreadExecutor 用的是無界隊列任務(wù)堆積可能撐爆內(nèi)存newCachedThreadPool 最大線程數(shù)是 Integer.MAX_VALUE可能創(chuàng)建過多線程。所以生產(chǎn)環(huán)境推薦直接 new ThreadPoolExecutor自己指定核心參數(shù)。3.2 真題演練synchronized 鎖升級和死鎖題一synchronized 鎖升級的原理是什么這題屬于多線程里的進階題初級崗問到就算加分。答題思路按「對象頭 → 偏向鎖 → 輕量級鎖 → 重量級鎖」的順序說。鎖對象的對象頭里有個 threadid 字段。第一次訪問時 threadid 為空JVM 讓它持有偏向鎖并把 threadid 設(shè)為該線程 id。再次進入時先判斷 threadid 是否一致一致就直接用不一致就把偏向鎖升級為輕量級鎖通過自旋循環(huán)一定次數(shù)獲取鎖。自旋若干次還沒拿到就升級為重量級鎖。最后補一句鎖升級的目的Java 6 之后用這種方式優(yōu)化 synchronized降低鎖帶來的性能消耗。這句話是得分點說明你知道「為什么要有鎖升級」。題二什么是死鎖怎么防止死鎖死鎖的定義要說得具體線程 A 持有獨占鎖 a嘗試獲取獨占鎖 b線程 B 持有獨占鎖 b嘗試獲取獨占鎖 a雙方互相持有對方需要的鎖形成阻塞這就是死鎖。防止死鎖的方法題庫給了四條用 tryLock 設(shè)置超時時間超時退出用 java.util.concurrent 并發(fā)類代替手寫鎖降低鎖的使用粒度不要幾個功能共用一把鎖減少同步代碼塊的范圍。答題時可以把這四條歸納成兩個方向一是破壞「請求與保持」條件用超時機制二是破壞「循環(huán)等待」條件降低鎖粒度、避免嵌套加鎖。能歸納出方向比單純背四條更有說服力。3.3 真題演練sleep 和 wait、run 和 start題一sleep() 和 wait() 有什么區(qū)別三個維度說清楚。類的不同sleep 來自 Threadwait 來自 Object。釋放鎖sleep 不釋放鎖wait 釋放鎖。用法不同sleep 時間到自動恢復wait 需要用 notify 或 notifyAll 喚醒。這題最容易錯的是「釋放鎖」這一條很多人記反。記住一個口訣wait 是等別人叫醒所以得先把鎖讓出來sleep 是睡一會兒鎖還攥在手里。題二線程的 run() 和 start() 有什么區(qū)別start() 用于啟動線程run() 用于執(zhí)行線程的運行時代碼。run() 可以重復調(diào)用start() 只能調(diào)用一次。追問「為什么 start 只能調(diào)一次」答調(diào)用 start 后線程進入就緒狀態(tài)再由 JVM 調(diào)度執(zhí)行 run重復調(diào)用會拋 IllegalThreadStateException。4. 集合與 Spring 模塊HashMap 原理和 IOC 是兩道分水嶺4.1 HashMap 實現(xiàn)原理答到紅黑樹才算完整HashMap 是集合模塊的核心考點。答題按「put 流程 → hash 沖突 → 鏈表轉(zhuǎn)紅黑樹」的順序說。通過 put(key, value) 存儲get(key) 獲取。傳入 key 時HashMap 根據(jù) key.hashCode() 計算 hash 值根據(jù) hash 值把 value 存到 bucket 里。hash 值相同時叫 hash 沖突HashMap 用鏈表和紅黑樹存儲相同 hash 值的 value。沖突個數(shù)少時用鏈表多時用紅黑樹。面試官可能追問「鏈表轉(zhuǎn)紅黑樹的閾值是多少」答 8「紅黑樹轉(zhuǎn)回鏈表的閾值」答 6。這兩個數(shù)字能說出來說明你不是只背了概念。配套的對比題也要準備HashMap 和 Hashtable 的區(qū)別存儲上 HashMap 允許 key 和 value 為 nullHashtable 不允許線程安全上 Hashtable 安全HashMap 不安全推薦使用上Hashtable 是保留類不建議用單線程用 HashMap多線程用 ConcurrentHashMap。4.2 真題演練ArrayList 與 LinkedList、Iterator題一ArrayList 和 LinkedList 的區(qū)別是什么從三個維度答。數(shù)據(jù)結(jié)構(gòu)ArrayList 是動態(tài)數(shù)組LinkedList 是雙向鏈表。隨機訪問ArrayList 效率高LinkedList 要移動指針從頭找。增刪效率非首尾的增刪LinkedList 比 ArrayList 高因為 ArrayList 增刪要影響數(shù)組內(nèi)其他元素的下標。最后給結(jié)論頻繁讀取用 ArrayList插入刪除多用 LinkedList。這個結(jié)論是面試官想聽的落地判斷。題二Iterator 怎么使用有什么特點先給代碼ListString list new ArrayList(); IteratorString it list.iterator(); while (it.hasNext()) { String obj it.next(); System.out.println(obj); }然后說特點Iterator 更安全因為當前遍歷的集合元素被更改時會拋 ConcurrentModificationException。追問「為什么用 Iterator 遍歷時刪除元素會拋異?!勾餓terator 內(nèi)部維護了一個 modCount集合結(jié)構(gòu)變化時 modCount 改變Iterator 檢查到不一致就拋異常。正確做法是用 Iterator 自己的 remove 方法。4.3 Spring 模塊IOC 和 AOP 要能舉例Spring/Spring MVC 是初級崗的高頻模塊。IOC 和 AOP 兩個概念必須能說清楚還要能舉例子。IOC 是控制反轉(zhuǎn)把對象的創(chuàng)建和依賴管理交給容器你不需要自己 new 對象容器幫你注入。舉例Service 里需要 Dao不用自己 new DaoImpl加個注解容器就注入了。AOP 是面向切面編程把日志、事務(wù)這些橫切邏輯從業(yè)務(wù)代碼里抽出來通過代理在方法前后織入。舉例事務(wù)管理不用在每個方法里寫開啟和提交事務(wù)加個注解就行。Spring MVC 的請求處理流程也常問請求到 DispatcherServlet它查 HandlerMapping 找到對應(yīng) ControllerController 處理完返回 ModelAndViewViewResolver 解析視圖最后渲染返回。這個流程能按順序說下來就行不用背類名全稱。5. 易錯點這五道題初級崗最容易答錯5.1 錯在哪Math.round(-1.5) 答成 -2很多人按「四舍五入」的直覺答 -2實際答案是 -1。錯在沒理解 round 的規(guī)則數(shù)軸上取值時中間值 0.5 向右取整所以正 0.5 往上取整負 0.5 直接舍棄。正確答法是先說答案 -1再解釋「向右取整」這個規(guī)則。這題考的是你有沒有真的跑過代碼而不是憑感覺。5.2 錯在哪抽象類必須有抽象方法很多人以為抽象類里必須有抽象方法實際不需要。抽象類可以一個抽象方法都沒有照樣正常運行。錯在把「抽象類」和「有抽象方法」畫了等號。正確答法抽象類不一定有抽象方法但有抽象方法的類一定是抽象類。再補一句 final 不能修飾抽象類因為抽象類就是用來被繼承的final 讓它不能被繼承兩者矛盾。5.3 錯在哪String 是基礎(chǔ)數(shù)據(jù)類型String 不是基礎(chǔ)類型?;A(chǔ)類型只有 8 種byte、boolean、char、short、int、float、long、double。String 是對象。這題錯在概念混淆答錯會顯得基礎(chǔ)不牢。正確答法直接說「String 不屬于基礎(chǔ)類型它是對象」然后把 8 種基礎(chǔ)類型報一遍。5.4 錯在哪poll() 和 remove() 答反Queue 里 poll() 和 remove() 都是返回第一個元素并刪除區(qū)別在沒元素時的行為poll() 返回 nullremove() 拋 NoSuchElementException。很多人記反或者只記得「都是刪除」就說沒區(qū)別。正確答法先說相同點再說不同點最后補一句「所以不確定隊列是否為空時用 poll 更安全」。5.5 錯在哪volatile 能保證原子性volatile 只保證可見性不保證原子性。synchronized 既保證可見性又保證原子性。這題錯在把 volatile 的作用夸大了。正確答法volatile 是變量修飾符synchronized 修飾類、方法、代碼段volatile 僅實現(xiàn)變量修改的可見性不能保證原子性volatile 不會造成線程阻塞synchronized 可能阻塞。三條對比說完再補一句「所以 i 這種復合操作用 volatile 修飾也不安全」。6. 答題技巧初級崗面試怎么把 208 道題用出最大效果6.1 背題不如背「追問鏈」208 道題如果一道一道背背到第 100 道前面的就忘了。更高效的做法是背「追問鏈」每道題準備兩層追問。比如背 和 equals就要準備好「String 為什么重寫 equals」「重寫 equals 為什么必須重寫 hashCode」「hashCode 相同 equals 一定相同嗎」這三個追問。面試官問第一層你答完主動帶一句「這里還涉及 hashCode 的約定」他就順著問了而你已經(jīng)準備好了。6.2 用「三層答題法」控制節(jié)奏每道題按三層答第一層給結(jié)論第二層說原因第三層舉例子或說場景。比如問線程池創(chuàng)建方式第一層說「核心是 ThreadPoolExecutor其他六種都是它的封裝」第二層說「各自的特點和適用場景」第三層說「生產(chǎn)環(huán)境推薦自己 new ThreadPoolExecutor因為 Executors 的默認隊列可能撐爆內(nèi)存」。三層答完就停不要一口氣把所有知道的都倒出來。留空間給面試官追問追問是你展示深度的機會。6.3 代碼題要能手寫關(guān)鍵片段初級崗面試經(jīng)常讓你手寫代碼高頻的有字符串反轉(zhuǎn)、單例模式、生產(chǎn)者消費者、冒泡排序。字符串反轉(zhuǎn)用 StringBuilder 的 reverse 方法StringBuilder sb new StringBuilder(); sb.append(abcdefg); System.out.println(sb.reverse()); // gfedcba單例模式寫雙重檢查鎖public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } } return instance; } }注意 volatile 不能省它防止指令重排導致其他線程拿到未初始化完的對象。這個點能說出來是加分項。6.4 押題思路把十八個模塊壓成三張紙最后一周不要再翻 208 道題把它壓成三張紙。第一張寫 Java 基礎(chǔ)和多線程的核心概念對比比如 與 equals、sleep 與 wait、synchronized 與 Lock、ArrayList 與 LinkedList。第二張寫框架和數(shù)據(jù)庫的關(guān)鍵流程比如 Spring IOC、AOP、Spring MVC 請求流程、MySQL 索引和事務(wù)。第三張寫邊角模塊的關(guān)鍵詞比如反射的三種獲取 Class 方式、淺拷貝與深拷貝、BIO/NIO/AIO 區(qū)別、設(shè)計模式的單例和工廠。三張紙過一遍能說出來的就過說不出來的標記出來重點看。面試前一天只看標記的。我當年第一次面初級崗把 208 道題從頭背到尾結(jié)果面試官問「HashMap 擴容為什么是 2 倍」我卡住了因為題庫里沒寫。從那以后我每次準備面試都強制走一遍「追問鏈」每道題至少準備兩層追問答完第一層主動往第二層引。這個習慣讓我后來再沒在基礎(chǔ)題上翻過車。希望幫到你。本文還有配套的精品資源點擊獲取