我花了一周,總結(jié)了一份Java學(xué)習(xí)/面試自測(cè)指南!200+道Java最常見(jiàn)面試題!
開(kāi)始之前,先說(shuō)一下我非常推薦的一種學(xué)習(xí)方式:
帶著問(wèn)題學(xué)習(xí)或者準(zhǔn)備面試。
另外,準(zhǔn)備面試的小伙伴,一定要根據(jù)自身情況制定好復(fù)習(xí)計(jì)劃! 并且,你最好還要時(shí)不時(shí)自測(cè)一下,對(duì)著一些面試常見(jiàn)的問(wèn)題進(jìn)行自問(wèn)。
為了方便大家,我分析了百余份 2020 最新大廠面經(jīng),整理了面試中最最最常問(wèn)的一些問(wèn)題!小伙伴們可以對(duì)照著這篇文章學(xué)習(xí)或者準(zhǔn)備面試。
網(wǎng)上也有一些類(lèi)似的面試題總結(jié)的文章,大家以我這篇為準(zhǔn)就好!毫不吹牛,Guide哥 整理,質(zhì)量有保障!(基于事實(shí)的自信 ??)
另外,內(nèi)容會(huì)繼續(xù)完善,歡迎你在評(píng)論區(qū)說(shuō)出你遇到的高頻面試題!
以下所有問(wèn)題的答案可以參考(大部分都能找到):JavaGuide[1](「Java 學(xué)習(xí)+面試指南」一份涵蓋大部分 Java 程序員所需要掌握的核心知識(shí)。準(zhǔn)備 Java 面試,首選 JavaGuide!)。
Java
基礎(chǔ)
Java 基礎(chǔ)這部分有一些太簡(jiǎn)單的問(wèn)題就直接沒(méi)有放上來(lái)。小伙伴們可以參考: Java 基礎(chǔ)知識(shí)點(diǎn)總結(jié)[2]。
Java 中的幾種基本數(shù)據(jù)類(lèi)型是什么?對(duì)應(yīng)的包裝類(lèi)型是什么?各自占用多少字節(jié)呢? String、 StringBuffer和StringBuilder的區(qū)別是什么?String為什么是不可變的?== 與 equals?hashCode 與 equals ? Java 反射?反射有什么缺點(diǎn)?你是怎么理解反射的(為什么框架需要反射)? 談?wù)剬?duì) Java 注解的理解,解決了什么問(wèn)題? Java 泛型了解么?什么是類(lèi)型擦除?介紹一下常用的通配符? 內(nèi)部類(lèi)了解嗎?匿名內(nèi)部類(lèi)了解嗎? BIO,NIO,AIO 有什么區(qū)別?
Java 集合框架
說(shuō)說(shuō) List,Set,Map 三者的區(qū)別?三者底層的數(shù)據(jù)結(jié)構(gòu)? 有哪些集合是線程不安全的?怎么解決呢? 比較 HashSet、LinkedHashSet 和 TreeSet 三者的異同 HashMap 和 Hashtable 的區(qū)別?HashMap 和 HashSet 區(qū)別?HashMap 和 TreeMap 區(qū)別? HashMap 的底層實(shí)現(xiàn) HashMap 的長(zhǎng)度為什么是 2 的冪次方 ConcurrentHashMap 和 Hashtable 的區(qū)別? ConcurrentHashMap 線程安全的具體實(shí)現(xiàn)方式/底層具體實(shí)現(xiàn)
jvm
jvm 內(nèi)存結(jié)構(gòu) jvm 調(diào)優(yōu)參數(shù) 什么是類(lèi)加載?何時(shí)類(lèi)加載?類(lèi)加載流程? 知道哪些類(lèi)加載器。類(lèi)加載器之間的關(guān)系? 類(lèi)加載器的雙親委派了解么?結(jié)合 Tomcat 說(shuō)一下雙親委派(Tomcat 如何打破雙親委托機(jī)制?...)。 為什么需要雙親委派 Java 內(nèi)存模型 棧中存放什么數(shù)據(jù),堆中呢? 大對(duì)象放在哪個(gè)內(nèi)存區(qū)域 堆區(qū)如何分類(lèi) 垃圾回收有哪些算法 GC 的全流程 GC 中老年代用什么回收方法?
多線程
線程和進(jìn)程的區(qū)別。 什么是上下文切換? 什么是線程死鎖?如何避免死鎖? 樂(lè)觀鎖和悲觀鎖了解么? 說(shuō)說(shuō) sleep()方法和wait()方法區(qū)別和共同點(diǎn)?Java 線程池有哪些參數(shù)?阻塞隊(duì)列有幾種?拒絕策略有幾種?新線程添加的流程? 實(shí)現(xiàn) Runnable接口和Callable接口的區(qū)別。講一下 JMM(Java 內(nèi)存模型)。 volatile關(guān)鍵字解決了什么問(wèn)題?說(shuō)說(shuō)synchronized關(guān)鍵字和volatile關(guān)鍵字的區(qū)別。AQS 原理了解么?AQS 組件有哪些? 用過(guò) CountDownLatch 么?什么場(chǎng)景下用的?
網(wǎng)絡(luò)
OSI 與 TCP/IP 各層的結(jié)構(gòu)與功能,都有哪些協(xié)議?為什么網(wǎng)絡(luò)要分層? 計(jì)算機(jī)網(wǎng)絡(luò)的一些常見(jiàn)狀態(tài)碼 ping 所使用的協(xié)議 TCP 的三次握手與四次揮手的內(nèi)容?TCP 為什么連接是三次握手而斷開(kāi)是四次握手? TCP 與 UDP 的區(qū)別及使用場(chǎng)景 TCP 是如何保證傳輸?shù)目煽啃裕?/section> 一次完整的 HTTP 請(qǐng)求所經(jīng)的步驟 HTTP 協(xié)議了解么?HTTP 是基于 TCP 還是 UDP 的? HTTP 報(bào)文的內(nèi)容簡(jiǎn)單說(shuō)一下!HTTP 請(qǐng)求報(bào)文和響應(yīng)報(bào)文中有哪些數(shù)據(jù)? HTTP 和 HTTPS 的區(qū)別了解么? HTTP 請(qǐng)求有哪些常見(jiàn)的狀態(tài)碼? HTTP 長(zhǎng)連接和短連接了解么? Cookie 和 Session 的關(guān)系 URI 和 URL 的區(qū)別是什么?
算法和數(shù)據(jù)結(jié)構(gòu)
算法
LRU 算法了解嗎?你能實(shí)現(xiàn)一個(gè)嗎? 寫(xiě)排序算法(快排、堆排) 使用數(shù)組實(shí)現(xiàn)一個(gè)棧 使用數(shù)組實(shí)現(xiàn)一個(gè)隊(duì)列 實(shí)現(xiàn)一個(gè)鏈表、反轉(zhuǎn)鏈表、 ......
數(shù)據(jù)結(jié)構(gòu)
數(shù)組 vs 鏈表 棧的應(yīng)用場(chǎng)景 隊(duì)列的分類(lèi)、應(yīng)用場(chǎng)景 紅黑樹(shù)的特點(diǎn)、紅黑樹(shù) vs 二叉查找樹(shù) 哈希表、哈希表應(yīng)用場(chǎng)景 布隆過(guò)濾器了解嗎? ......
系統(tǒng)設(shè)計(jì)
設(shè)計(jì)模式
何為設(shè)計(jì)模式?有哪些常見(jiàn)的設(shè)計(jì)模式? 單例模式了解么?說(shuō)一下單例模式的使用場(chǎng)景。手寫(xiě)一個(gè)單例模式的實(shí)現(xiàn)。 觀察者模式了解么?說(shuō)一下觀察者模式的使用場(chǎng)景。 工廠模式了解么?說(shuō)一下工廠模式的使用場(chǎng)景。 責(zé)任鏈模式了解么?哪些開(kāi)源項(xiàng)目(Netty、MyBatis ...)中用到了責(zé)任鏈模式?怎么用的? SOLID 原則了解么?簡(jiǎn)單談?wù)勛约簩?duì)于單一職責(zé)原則和開(kāi)閉原則的理解。 閱讀 Spring 源碼的時(shí)候什么設(shè)計(jì)模式最讓你影響深刻?能簡(jiǎn)單講講嗎?
常見(jiàn)框架
Spring
什么是 Spring 框架? 列舉一些重要的 Spring 模塊? 談?wù)勛约簩?duì)于 Spring IoC 和 AOP 的理解 Spring Bean 的生命周期說(shuō)一下 Spring 中的 bean 的作用域有哪些? 攔截器和過(guò)濾器了解么? Spring 動(dòng)態(tài)代理默認(rèn)用哪一種 hibernate 和 mybatis 區(qū)別 Spring Boot 和 Spring 的區(qū)別 說(shuō)出使用 Spring Boot 的主要優(yōu)點(diǎn) 什么是 Spring Boot Starter? 介紹一下 @SpringBootApplication注解Spring Boot 的自動(dòng)配置是如何實(shí)現(xiàn)的? Spring Boot 支持哪些嵌入式 web 容器?
Netty
BIO,NIO 和 AIO 有啥區(qū)別? Netty 是什么?為啥不直接用 NIO 呢? 為什么要用 Netty?Netty 應(yīng)用場(chǎng)景了解么? 介紹一下 Netty 的核心組件? Bootstrap 和 ServerBootstrap 了解么? NioEventLoopGroup 默認(rèn)的構(gòu)造函數(shù)會(huì)起多少線程? Netty 線程模型了解么? 什么是 TCP 粘包/拆包?有什么解決辦法呢? Netty 長(zhǎng)連接、心跳機(jī)制了解么?
權(quán)限認(rèn)證
認(rèn)證 (Authentication) 和授權(quán) (Authorization)的區(qū)別是什么? 什么是 Cookie ? Cookie 的作用是什么?如何在服務(wù)端使用 Cookie ? Cookie 和 Session 有什么區(qū)別?如何使用 Session 進(jìn)行身份驗(yàn)證? 如果沒(méi)有 Cookie 的話 Session 還能用嗎? 為什么 Cookie 無(wú)法防止 CSRF 攻擊,而 token 可以? 什么是 Token?什么是 JWT?如何基于 Token 進(jìn)行身份驗(yàn)證? 什么是 OAuth 2.0? 什么是 SSO(單點(diǎn)登錄)?
微服務(wù)/分布式
RPC
RPC 基礎(chǔ):
了解 RPC 嗎?有哪些常見(jiàn)的 RPC 框架? 如果讓你自己設(shè)計(jì) RPC 框架你會(huì)如何設(shè)計(jì)? 服務(wù)之間的調(diào)用為啥不直接用 HTTP 而用 RPC?
Dubbo:
Dubbo 了解嗎? Dubbo 的工作原理了解么?注冊(cè)中心扮演了什么角色?注冊(cè)中心掛了可以繼續(xù)通信嗎? Dubbo 的負(fù)載均衡策略了解么? Dubbo 的 spi 機(jī)制了解么?帶來(lái)了啥好處?
消息隊(duì)列
為什么要用消息隊(duì)列? 對(duì)比一下常見(jiàn)的消息隊(duì)列? 如何保證消息不被重復(fù)消費(fèi)? 如何保證消息消費(fèi)的順序性?
分布式 ID
何為 ID? 何為分布式 ID? 一個(gè)合格的分布式 ID 需要滿足什么要求? 分布式 ID 常見(jiàn)的生成方法有哪些?(數(shù)據(jù)庫(kù)主鍵自增、數(shù)據(jù)庫(kù)的號(hào)段模式、UUID、SNOWFLAKE 等等)
其他(網(wǎng)關(guān)、限流...)
為什么要網(wǎng)關(guān)? 為什么要用分布式鎖?有哪些實(shí)現(xiàn)方式? 限流的算法有哪些? 什么是服務(wù)熔斷?什么是服務(wù)降級(jí)? 為什么要分布式 id ?分布式 id 生成策略有哪些? 微服務(wù)下為什需要鏈路追蹤系統(tǒng)?
數(shù)據(jù)庫(kù)
MySQL
基礎(chǔ)
非關(guān)系型數(shù)據(jù)庫(kù)和關(guān)系型數(shù)據(jù)庫(kù)的區(qū)別? 事務(wù)的四大特性了解么? MySQL 事務(wù)隔離級(jí)別?默認(rèn)是什么級(jí)別? 樂(lè)觀鎖與悲觀鎖的區(qū)別? MySQL 數(shù)據(jù)庫(kù)兩種存儲(chǔ)引擎的區(qū)別?
索引
為什么索引能提高查詢速度? 聚集索引和非聚集索引的區(qū)別?非聚集索引一定回表查詢嗎? 索引這么多優(yōu)點(diǎn),為什么不對(duì)表中的每一個(gè)列創(chuàng)建一個(gè)索引呢?(使用索引一定能提高查詢性能嗎?) 索引底層的數(shù)據(jù)結(jié)構(gòu)了解么?Hash 索引和 B+樹(shù)索引優(yōu)劣分析 B+樹(shù)做索引比紅黑樹(shù)好在哪里? 最左前綴匹配原則了解么? 什么是覆蓋索引
Redis
分布式緩存常見(jiàn)的技術(shù)選型方案有哪些?說(shuō)一下 Redis 和 Memcached 的區(qū)別和共同點(diǎn) 說(shuō)一下有緩存情況下查詢數(shù)據(jù)和修改數(shù)據(jù)的流程。 Redis 有哪些數(shù)據(jù)結(jié)構(gòu)?SDS 了解么? Redis 內(nèi)存滿了怎么辦? Redis 內(nèi)存淘汰算法除了 LRU 還有哪些? Redis 給緩存數(shù)據(jù)設(shè)置過(guò)期時(shí)間有啥用?Redis 是如何判斷數(shù)據(jù)是否過(guò)期的呢? Redis 事務(wù)了解么?(Redis 可以通過(guò) MULTI,EXEC,DISCARD 和 WATCH 等命令來(lái)實(shí)現(xiàn)事務(wù)功能) 緩存穿透和緩存雪崩問(wèn)題了解么?有哪些解決辦法? 如何基于 Redis 實(shí)現(xiàn)分布式鎖?
進(jìn)階
一條 SQL 語(yǔ)句在 MySQL 中如何執(zhí)行的? explain 命令了解么? 簡(jiǎn)單說(shuō)一下 SQL 調(diào)優(yōu)思路。 簡(jiǎn)單說(shuō)一下大表優(yōu)化的思路。 分庫(kù)分表了解么?為什么要分庫(kù)分表?有哪些常見(jiàn)的分庫(kù)分表工具( sharding-jdbc、TSharding、MyCAT...)?
系統(tǒng)設(shè)計(jì)/場(chǎng)景題
假如有 10 億個(gè)數(shù),只有一個(gè)重復(fù),內(nèi)存只能放下 5 億個(gè)數(shù),怎么找到這個(gè)重復(fù)的數(shù)字? 如何設(shè)計(jì)一個(gè)秒殺系統(tǒng)(服務(wù)端、數(shù)據(jù)庫(kù)、分布式)?分布式系統(tǒng)的設(shè)計(jì)? 有一個(gè)服務(wù)器專(zhuān)門(mén)接收大量請(qǐng)求,怎么設(shè)計(jì)? 如果讓你自己設(shè)計(jì) RPC 框架你會(huì)如何設(shè)計(jì)? 怎么快速出現(xiàn)一個(gè) stackoverflow 錯(cuò)誤?
其他問(wèn)題
自我介紹。 說(shuō)說(shuō)你的項(xiàng)目中的亮點(diǎn)有哪些。 畫(huà)一下你的項(xiàng)目的架構(gòu)圖。 Restful 了解嗎?簡(jiǎn)單說(shuō)一下自己對(duì)它的認(rèn)識(shí),如果我要返回一個(gè) boolean 類(lèi)型的數(shù)據(jù)怎么辦?
經(jīng)驗(yàn)總結(jié)
多面試,不要害怕失敗,多總結(jié)經(jīng)驗(yàn)。 盡早準(zhǔn)備,不論是找工作前、面試前還是面試后。 熟悉自己的簡(jiǎn)歷。 電話和視頻面試很平常,面試前提前準(zhǔn)備一下。 堅(jiān)持!offer 雖然可能會(huì)遲到,但是只要不放棄,就一定不會(huì)缺席。
參考資料
JavaGuide: https://github.com/Snailclimb/JavaGuide
[2]Java 基礎(chǔ)知識(shí)點(diǎn)總結(jié): https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/Java基礎(chǔ)知識(shí).md
推薦??:V4.0 《JavaGuide 面試突擊版》來(lái)啦!年初搞波大的
推薦??: Github掘金計(jì)劃:Github上的一些優(yōu)質(zhì)項(xiàng)目搜羅
