【面試題】2018年最全Java面試通關秘籍匯總集!(轉載於互聯網)
前幾天在交流群里有些小伙伴問面試相關的試題,當時給出了一些問題,苦於打字太累就沒寫下去了,但覺得這是一個很不負責任的表現,於是下來整理了一下近幾年的私藏,特分享給大家!
此套面試題適用於Java開發的各個階段面試,不過更偏向初級和中級開發人員!由於每一個問題的答案不唯一且都可以在網上搜索到答案,這里只給出問題,不列出參考答案,有興趣的可以留言討論,也歡迎大家的補充!
一、基礎篇
1.1、Java基礎
-
面向對象的特征:繼承、封裝和多態
-
final, finally, finalize 的區別
-
Exception、Error、運行時異常與一般異常有何異同
-
請寫出5種常見到的runtime exception
-
int 和 Integer 有什么區別,Integer的值緩存范圍
-
包裝類,裝箱和拆箱
-
String、StringBuilder、StringBuffer
-
重載和重寫的區別
-
抽象類和接口有什么區別
-
說說反射的用途及實現
-
說說自定義注解的場景及實現
-
HTTP請求的GET與POST方式的區別
-
Session與Cookie區別
-
列出自己常用的JDK包
-
MVC設計思想
-
equals與==的區別
-
hashCode和equals方法的區別與聯系
-
什么是Java序列化和反序列化,如何實現Java序列化?或者請解釋Serializable 接口的作用
-
Object類中常見的方法,為什么wait notify會放在Object里邊?
-
Java的平台無關性如何體現出來的
-
JDK和JRE的區別
-
Java 8有哪些新特性
1.2、Java常見集合
-
List 和 Set 區別
-
Set和hashCode以及equals方法的聯系
-
List 和 Map 區別
-
Arraylist 與 LinkedList 區別
-
ArrayList 與 Vector 區別
-
HashMap 和 Hashtable 的區別
-
HashSet 和 HashMap 區別
-
HashMap 和 ConcurrentHashMap 的區別
-
HashMap 的工作原理及代碼實現,什么時候用到紅黑樹
-
多線程情況下HashMap死循環的問題
-
HashMap出現Hash DOS攻擊的問題
-
ConcurrentHashMap 的工作原理及代碼實現,如何統計所有的元素個數
-
手寫簡單的HashMap
-
看過那些Java集合類的源碼
1.3、進程和線程
-
線程和進程的概念、並行和並發的概念
-
創建線程的方式及實現
-
進程間通信的方式
-
說說 CountDownLatch、CyclicBarrier 原理和區別
-
說說 Semaphore 原理
-
說說 Exchanger 原理
-
ThreadLocal 原理分析,ThreadLocal為什么會出現OOM,出現的深層次原理
-
講講線程池的實現原理
-
線程池的幾種實現方式
-
線程的生命周期,狀態是如何轉移的
-
可參考:《Java多線程編程核心技術》
1.4、鎖機制
-
說說線程安全問題,什么是線程安全,如何保證線程安全
-
重入鎖的概念,重入鎖為什么可以防止死鎖
-
產生死鎖的四個條件(互斥、請求與保持、不剝奪、循環等待)
-
如何檢查死鎖(通過jConsole檢查死鎖)
-
volatile 實現原理(禁止指令重排、刷新內存)
-
synchronized 實現原理(對象監視器)
-
synchronized 與 lock 的區別
-
AQS同步隊列
-
CAS無鎖的概念、樂觀鎖和悲觀鎖
-
常見的原子操作類
-
什么是ABA問題,出現ABA問題JDK是如何解決的
-
樂觀鎖的業務場景及實現方式
-
Java 8並法包下常見的並發類
-
偏向鎖、輕量級鎖、重量級鎖、自旋鎖的概念
-
可參考:《Java多線程編程核心技術》
1.5、JVM
-
JVM運行時內存區域划分
-
內存溢出OOM和堆棧溢出SOE的示例及原因、如何排查與解決
-
如何判斷對象是否可以回收或存活
-
常見的GC回收算法及其含義
-
常見的JVM性能監控和故障處理工具類:jps、jstat、jmap、jinfo、jconsole等
-
JVM如何設置參數
-
JVM性能調優
-
類加載器、雙親委派模型、一個類的生命周期、類是如何加載到JVM中的
-
類加載的過程:加載、驗證、准備、解析、初始化
-
強引用、軟引用、弱引用、虛引用
-
Java內存模型JMM
1.6、設計模式
-
常見的設計模式
-
設計模式的的六大原則及其含義
-
常見的單例模式以及各種實現方式的優缺點,哪一種最好,手寫常見的單利模式
-
設計模式在實際場景中的應用
-
Spring中用到了哪些設計模式
-
MyBatis中用到了哪些設計模式
-
你項目中有使用哪些設計模式
-
說說常用開源框架中設計模式使用分析
-
動態代理很重要!!!
1.7、數據結構
-
樹(二叉查找樹、平衡二叉樹、紅黑樹、B樹、B+樹)
-
深度有限算法、廣度優先算法
-
克魯斯卡爾算法、普林母算法、迪克拉斯算法
-
什么是一致性Hash及其原理、Hash環問題
-
常見的排序算法和查找算法:快排、折半查找、堆排序等
1.8、網絡/IO基礎
-
BIO、NIO、AIO的概念
-
什么是長連接和短連接
-
Http1.0和2.0相比有什么區別,可參考《Http 2.0》
-
Https的基本概念
-
三次握手和四次揮手、為什么揮手需要四次
-
從游覽器中輸入URL到頁面加載的發生了什么?可參考《從輸入URL到頁面加載發生了什么》
二、數據存儲和消息隊列
2.1、數據庫
-
MySQL 索引使用的注意事項
-
DDL、DML、DCL分別指什么
-
explain命令
-
left join,right join,inner join
-
數據庫事物ACID(原子性、一致性、隔離性、持久性)
-
事物的隔離級別(讀未提交、讀以提交、可重復讀、可序列化讀)
-
臟讀、幻讀、不可重復讀
-
數據庫的幾大范式
-
數據庫常見的命令
-
說說分庫與分表設計
-
分庫與分表帶來的分布式困境與應對之策(如何解決分布式下的分庫分表,全局表?)
-
說說 SQL 優化之道
-
MySQL遇到的死鎖問題、如何排查與解決
-
存儲引擎的 InnoDB與MyISAM區別,優缺點,使用場景
-
索引類別(B+樹索引、全文索引、哈希索引)、索引的原理
-
什么是自適應哈希索引(AHI)
-
為什么要用 B+tree作為MySQL索引的數據結構
-
聚集索引與非聚集索引的區別
-
遇到過索引失效的情況沒,什么時候可能會出現,如何解決
-
limit 20000 加載很慢怎么解決
-
如何選擇合適的分布式主鍵方案
-
選擇合適的數據存儲方案
-
常見的幾種分布式ID的設計方案
-
常見的數據庫優化方案,在你的項目中數據庫如何進行優化的
2.2、Redis
-
Redis 有哪些數據類型,可參考《Redis常見的5種不同的數據類型詳解》
-
Redis 內部結構
-
Redis 使用場景
-
Redis 持久化機制,可參考《使用快照和AOF將Redis數據持久化到硬盤中》
-
Redis 集群方案與實現
-
Redis 為什么是單線程的?
-
緩存雪崩、緩存穿透、緩存預熱、緩存更新、緩存降級
-
使用緩存的合理性問題
-
Redis常見的回收策略
2.3、消息隊列
-
消息隊列的使用場景
-
消息的重發補償解決思路
-
消息的冪等性解決思路
-
消息的堆積解決思路
-
自己如何實現消息隊列
-
如何保證消息的有序性
三、開源框架和容器
3.1、SSM/Servlet
-
Servlet的生命周期
-
轉發與重定向的區別
-
BeanFactory 和 ApplicationContext 有什么區別
-
Spring Bean 的生命周期
-
Spring IOC 如何實現
-
Spring中Bean的作用域,默認的是哪一個
-
說說 Spring AOP、Spring AOP 實現原理
-
動態代理(CGLib 與 JDK)、優缺點、性能對比、如何選擇
-
Spring 事務實現方式、事務的傳播機制、默認的事務類別
-
Spring 事務底層原理
-
Spring事務失效(事務嵌套),JDK動態代理給Spring事務埋下的坑,可參考《JDK動態代理給Spring事務埋下的坑!》
-
如何自定義注解實現功能
-
Spring MVC 運行流程
-
Spring MVC 啟動流程
-
Spring 的單例實現原理
-
Spring 框架中用到了哪些設計模式
-
Spring 其他產品(Srping Boot、Spring Cloud、Spring Secuirity、Spring Data、Spring AMQP 等)
-
有沒有用到Spring Boot,Spring Boot的認識、原理
-
MyBatis的原理
-
可參考《為什么會有Spring》
-
可參考《為什么會有Spring AOP》
3.2、Netty
-
為什么選擇 Netty
-
說說業務中,Netty 的使用場景
-
原生的 NIO 在 JDK 1.7 版本存在 epoll bug
-
什么是TCP 粘包/拆包
-
TCP粘包/拆包的解決辦法
-
Netty 線程模型
-
說說 Netty 的零拷貝
-
Netty 內部執行流程
-
Netty 重連實現
3.3、Tomcat
-
Tomcat的基礎架構(Server、Service、Connector、Container)
-
Tomcat如何加載Servlet的
-
Pipeline-Valve機制
-
可參考:《四張圖帶你了解Tomcat系統架構!》
四、分布式
4.1、Nginx
-
請解釋什么是C10K問題或者知道什么是C10K問題嗎?
-
Nginx簡介,可參考《Nginx簡介》
-
正向代理和反向代理.
-
Nginx幾種常見的負載均衡策略
-
Nginx服務器上的Master和Worker進程分別是什么
-
使用“反向代理服務器”的優點是什么?
4.2、分布式其他
-
談談業務中使用分布式的場景
-
Session 分布式方案
-
Session 分布式處理
-
分布式鎖的應用場景、分布式鎖的產生原因、基本概念
-
分布是鎖的常見解決方案
-
分布式事務的常見解決方案
-
集群與負載均衡的算法與實現
-
說說分庫與分表設計,可參考《數據庫分庫分表策略的具體實現方案》
-
分庫與分表帶來的分布式困境與應對之策
4.3、Dubbo
-
什么是Dubbo,可參考《Dubbo入門》
-
什么是RPC、如何實現RPC、RPC 的實現原理,可參考《基於HTTP的RPC實現》
-
Dubbo中的SPI是什么概念
-
Dubbo的基本原理、執行流程
五、微服務
5.1、微服務
-
前后端分離是如何做的?
-
微服務哪些框架
-
Spring Could的常見組件有哪些?可參考《Spring Cloud概述》
-
領域驅動有了解嗎?什么是領域驅動模型?充血模型、貧血模型
-
JWT有了解嗎,什么是JWT,可參考《前后端分離利器之JWT》
-
你怎么理解 RESTful
-
說說如何設計一個良好的 API
-
如何理解 RESTful API 的冪等性
-
如何保證接口的冪等性
-
說說 CAP 定理、BASE 理論
-
怎么考慮數據一致性問題
-
說說最終一致性的實現方案
-
微服務的優缺點,可參考《微服務批判》
-
微服務與 SOA 的區別
-
如何拆分服務、水平分割、垂直分割
-
如何應對微服務的鏈式調用異常
-
如何快速追蹤與定位問題
-
如何保證微服務的安全、認證
5.2、安全問題
-
如何防范常見的Web攻擊、如何方式SQL注入
-
服務端通信安全攻防
-
HTTPS原理剖析、降級攻擊、HTTP與HTTPS的對比
5.3、性能優化
-
性能指標有哪些
-
如何發現性能瓶頸
-
性能調優的常見手段
-
說說你在項目中如何進行性能調優
六、其他
6.1、設計能力
-
說說你在項目中使用過的UML圖
-
你如何考慮組件化、服務化、系統拆分
-
秒殺場景如何設計
6.2、業務工程
-
說說你的開發流程、如何進行自動化部署的
-
你和團隊是如何溝通的
-
你如何進行代碼評審
-
說說你對技術與業務的理解
-
說說你在項目中遇到感覺最難Bug,是如何解決的
-
介紹一下工作中的一個你認為最有價值的項目,以及在這個過程中的角色、解決的問題、你覺得你們項目還有哪些不足的地方
6.3、軟實力
-
說說你的優缺點、亮點
-
說說你最近在看什么書、什么博客、在研究什么新技術、再看那些開源項目的源代碼
-
說說你覺得最有意義的技術書籍
-
工作之余做什么事情、平時是如何學習的,怎樣提升自己的能力
-
說說個人發展方向方面的思考
-
說說你認為的服務端開發工程師應該具備哪些能力
-
說說你認為的架構師是什么樣的,架構師主要做什么
-
如何看待加班的問題
當然,一個完整的面試肯定不止上述的知識點,其他的諸如:Linux、數據結構、算法、邏輯思維題、系統設計題、職業規划等等都會有所涉及!總之,充分的准備是應對一切面試的不二法寶!
歡迎留言討論上述的問題!有哪些經常被問到的面試題也歡迎大家留言補充!