15 道超经典大厂 Java 面试题!重中之重
從超高頻的后端面試題出發(fā),指明學習方向
大家好,我是魚皮。
還記得我的老弟小阿巴么?他目前正值大一暑假,在家自學編程(刷短視頻)中。
他整個大一期間基本都在學習前端。后來,我?guī)麑懥艘淮魏蠖?#xff0c;結(jié)果就崩了,寫了一堆 bug!
詳情請閱讀:前端老弟第一次寫后端,崩了!
但沒想到,這貨踩了坑后,反而愛上了后端開發(fā)。這一到周末就纏著我,讓我給他講講后端開發(fā)應該學習哪些知識。
雖然很想給他總結(jié)一份后端學習路線,但我也很忙,于是就思考有沒有什么更快捷的方式讓他了解到后端要學的技術(shù)。
我想想:他學編程是為了找好工作,想找到好工作就要先通過面試。。。
有了!正好我朋友在大廠 “阿巴阿巴” 做 Java 后端面試官,我直接把小阿巴送過去參與面試,不就能讓他知道自己要學的技術(shù)了么?
OK,起飛!
一天后,小阿巴回來了,一臉苦樣,說自己一道題都沒答出來。
我問了下考點,大笑道:你運氣太好了,這不全是后端面試中的 超高頻 經(jīng)典題目么?全中!
好了,下面就通過這次的大廠面試題,分享下后端程序員要學的知識以及緣由。
從面試題看后端必學知識
大綱:
編程語言
對于開發(fā)崗位的程序員,無論是前端還是后端,最低要求都是 熟練使用 至少一門編程語言。像前端的核心語言是 JavaScript,后端有 Java、C++、Golang、Python 等。
目前 Java 后端崗位的需求量比較大,所以這里以 Java 為例。
基礎
面試題
Java 中 == 和 equals 的區(qū)別?
題解
https://blog.csdn.net/qq_38162448/article/details/81611894
分析
熟練并不只是能寫出代碼就夠了,很多編程語法層面的 小細節(jié) 也必須關(guān)注!在工作中,很多 bug 的產(chǎn)生正是因為對細節(jié)知識的欠缺,因此這些細節(jié)也是面試官最愛考察的點。
比如 Java 中的 == 和 equals 都是判斷變量是否相等,但有啥區(qū)別呢?如果使用不當,很有可能會把相同值的變量判斷為不相等,導致業(yè)務邏輯錯誤。還有 final 關(guān)鍵字、volatile 關(guān)鍵字等,都是常用的 Java 語法,也是高頻考點。
所以,鞏固語法基礎很重要,推薦《Java 核心技術(shù)卷 I》。
類庫
面試題
Java 中的集合及其繼承關(guān)系?
題解
https://www.bilibili.com/video/BV1zD4y1Q7Fw
分析
每種編程語言都有內(nèi)置的類庫和函數(shù),雖然可能不是最方便的,但通常源碼實現(xiàn)都比較合理、性能也不錯。想熟練使用一門編程語言,提高開發(fā)效率,或者編寫自己的封裝庫,就一定要先掌握語言原生的類庫。
比如 Java 中提供了集合類,讓我們很輕松地操作各種數(shù)據(jù)結(jié)構(gòu),比如數(shù)組、鏈表、Set、Hash 等,這些都是工作中常用的類,因此有必要了解它們的原理,才能更合理、正確地去使用。像 HashMap 的實現(xiàn)原理、HashMap 和 HashTable 的區(qū)別、ArrayList 和 LinkedList 的區(qū)別,也是高頻考點。
框架
面試題
什么是 Spring 的依賴注入?
題解
https://zhuanlan.zhihu.com/p/25459839
分析
除了做基礎架構(gòu)之外,在企業(yè)中開發(fā)基本都是用現(xiàn)成的框架,不用什么都自己寫,能夠大大提升開發(fā)效率。但會用框架只是最基本的要求,怎么能最大化框架的性能、降低出 bug 的概率、進一步降低開發(fā)成本、甚至如何自己設計實現(xiàn)一個框架,才是優(yōu)秀的程序員應該思考的。因此,常用框架的設計原理是高頻考點,比如 Java 中 Spring 框架的核心設計 IOC 和 AOP、使用多級緩存解決循環(huán)依賴等。
底層
面試題
JVM 的內(nèi)存結(jié)構(gòu)是怎樣的?
題解
https://www.bilibili.com/video/BV1iJ411d7jS?p=2
分析
大廠面試中,少不了編程語言的底層實現(xiàn)。
雖然工作中很少會直接用到這方面的知識,但書到用時方恨少,大廠對求職者的需求通常不是你現(xiàn)在能做什么,而是你未來是否能夠應對潛在的挑戰(zhàn)。萬一到時候線上程序出一個緊急且嚴重的 bug,需要分析垃圾收集器的日志,讓你現(xiàn)學,還來得及么?這就要求我們了解底層,對 Java 來講,關(guān)鍵就是 Java 虛擬機(JVM)。
此外,了解底層能夠加深你對編程語言的理解和對架構(gòu)的認知,很多底層的設計原理是可以應用到工作寫程序中的,像如何分配管理內(nèi)存、垃圾收集器的設計、回收算法等。
簡單來說就是:把工具玩兒明白,讓造工具成為可能。
推薦書籍:《深入理解Java虛擬機》第3版
計算機基礎
無論你學習什么編程語言,這些知識都是程序員重要的基本功。雖然未必在工作中直接用到,但打好基礎,能夠全方面提升你的編程能力和素養(yǎng),在面對問題時才會有更多的想法和思考。
面試官通過這些問題,能看出你的學習是否扎實,是否可靠。
數(shù)據(jù)結(jié)構(gòu)
面試題
如何用棧實現(xiàn)隊列?
題解
https://leetcode-cn.com/problems/implement-queue-using-stacks/solution/
分析
數(shù)據(jù)結(jié)構(gòu)是獨立于編程語言的重要思想,像鏈表、數(shù)組、棧、隊列、集合、字符串、哈希表、樹等等,都是寫程序常用的數(shù)據(jù)結(jié)構(gòu),因此也是面試高頻考點。
工作中,雖然不會讓你自己實現(xiàn)一個數(shù)據(jù)結(jié)構(gòu),但至少要了解每個數(shù)據(jù)結(jié)構(gòu)的特點、使用場景、時間和空間復雜度,否則寫出來的代碼可能會 “又重又慢”,稍有不慎,內(nèi)存溢出!
算法
面試題
假設你正在爬樓梯。需要 n 階才能到達樓頂。每次你可以爬 1 或 2 個臺階,有多少種不同的方法可以爬到樓頂呢?
題解
https://leetcode-cn.com/problems/climbing-stairs/solution/
分析
和數(shù)據(jù)結(jié)構(gòu)類似,算法也是程序員的核心素養(yǎng)。像排序、動態(tài)規(guī)劃、遞歸、迭代、二分、分治、深搜廣搜等基礎算法,都是面試的重點。
計算機網(wǎng)絡
面試題
TCP 三次握手、四次揮手經(jīng)歷了哪些過程?
題解
https://blog.csdn.net/ThinkWon/article/details/104903925
分析
對后端開發(fā)而言,大部分的工作就是寫接口,接受前端或其他客戶端發(fā)送的網(wǎng)絡請求,給出對應的數(shù)據(jù)響應。因此,網(wǎng)絡知識相當重要。
比如工作中常用的網(wǎng)絡協(xié)議、HTTP 請求與響應、會話、四七層負載均衡等,都是常見考點。因為很多的協(xié)議都是在 TCP、UDP 的基礎上進行封裝,所以 TCP 和 UDP 也是高頻考點。了解這些有助于寫出更優(yōu)雅規(guī)范的接口、減少網(wǎng)絡請求的耗時、或者提高整個接口的并發(fā)度等。
操作系統(tǒng)
面試題
什么是死鎖?
題解
https://zhuanlan.zhihu.com/p/26945588
分析
操作系統(tǒng)雖然是很底層的知識,但畢竟我們編寫的程序都是跑在操作系統(tǒng)上的,因此操作系統(tǒng)的一些概念無時無刻不在被開發(fā)者使用,比如進程和線程、死鎖、文件、套接字、CPU、內(nèi)存管理、輸入輸出等。你思考問題的深度、程序性能優(yōu)化的極限,很大程度上取決于對操作系統(tǒng)的了解。
軟件開發(fā)
Mysql
面試題
MySQL 如何性能優(yōu)化?
題解
https://www.zhihu.com/question/19719997/answer/549041957
分析
大部分做后端開發(fā)的程序員離不開數(shù)據(jù)庫,而且工作中基本就是寫 CRUD,從數(shù)據(jù)庫中增刪改查數(shù)據(jù)。
對于在學校里做的小項目,基本了解數(shù)據(jù)庫的使用,會寫幾條簡單的 SQL 語句就夠了。但是在大廠業(yè)務(尤其是 ToC)中,數(shù)據(jù)量動輒百萬千萬、甚至數(shù)億,這就對數(shù)據(jù)庫設計和性能優(yōu)化提出了要求。
因此,大廠后端面試中,超高頻的面試題就是:MySQL 如何性能優(yōu)化?對于這類問題,只靠背誦很容易被面試官揭穿,比較推薦自己去做個項目,設計個庫表實戰(zhàn),看看不同的優(yōu)化方式是否有效、能得到多大的效果。
還有很常見的面試題就是:給你一個場景,讓你去設計數(shù)據(jù)庫表結(jié)構(gòu)。大部分題目都要求你臨場發(fā)揮,所以在平時多做項目、多去參考其他系統(tǒng)的設計真的很重要。
此外,還要了解數(shù)據(jù)庫中的常見概念,比如事務、鎖、索引等;還有一些基本操作,比如存儲過程、備份、定位慢查詢。否則可能寫出的代碼會有 bug、一不小心插入的數(shù)據(jù)就不一致了、一不小心就把整個表給鎖住了、刪庫跑路也無能為力等。
Redis
面試題
Redis 有哪些數(shù)據(jù)類型?
題解
https://www.runoob.com/redis/redis-data-types.html
分析
Redis 是一款高性能的 Key-Value 數(shù)據(jù)庫,它在后端開發(fā)中的作用非常大。
比如為了提高接口性能、減輕數(shù)據(jù)庫壓力,用 Redis 做緩存;為了解決并發(fā)沖突,使用 Redis 做分布式鎖;為了實現(xiàn)單點登錄、提高用戶效率,使用 Redis 存儲會話或令牌;Redis 還可以用于做實時排行榜、計數(shù)器、布隆過濾器、隊列系統(tǒng)等。
因此,大廠面試中,Redis 的考點也越來越多,常見的有 Redis 的基本使用(有哪些數(shù)據(jù)類型?有哪些應用場景?集群搭建)、工作機制(持久化機制 RDB 和 AOF 的區(qū)別?為什么單線程?) 、場景設計等。
設計模式
面試題
請手寫單例模式的實現(xiàn)代碼?
題解
https://www.cnblogs.com/yuanxion/p/14600626.html
分析
設計模式是程序員們在軟件開發(fā)過程中抽象出的、用于同一類問題的解決方案,一般是比函數(shù)、組件更高層的抽象,用了設計模式的代碼一般有如下特點:
正因為這些優(yōu)點,設計模式無論是對工作效率還是思想的提升都很有幫助,也成為了面試高頻考點。常見的設計模式雖然有 3 大類、23+ 種,但面試重點主要是單例模式、工廠模式、觀察者模式等。
并發(fā)編程
面試題
為什么用線程池?
題解
https://www.cnblogs.com/xinxindiandeng/p/6383311.html
分析
如何用最少的資源,寫出性能更高、更可靠、更可擴展的程序是后端程序員需要思考的問題。因此,高并發(fā)編程是面試的重點。像線程池、鎖、隊列、并發(fā)包、同步異步等,都是高頻考點。有時還會給一些實際問題讓你分析,比如經(jīng)典的秒殺系統(tǒng)的設計、訂單超賣問題如何解決。
Linux
面試題
Linux Top 命令的輸出信息分別表示什么?
題解
https://blog.csdn.net/weixin_41427129/article/details/113102533
分析
企業(yè)項目一般都是部署在云服務器上的,大部分服務器的操作系統(tǒng)都是 Linux,因此后端開發(fā)工作中,必不可少地要操作 Linux 服務器,比如部署項目、安裝和配置服務、查看系統(tǒng)運行信息、定位線上問題排障等。
因此,要熟悉基本的 Linux 命令,能夠適應無鼠標的命令行操作。
還要了解一些常用的系統(tǒng)分析命令,幫助排查問題。比如 top 命令,可以查看系統(tǒng)的資源占用、整體負載,還能具體查看每個進程占用了多少 CPU、內(nèi)存,從而鎖定異常線程。
Git
面試題
你用過 Git 版本控制系統(tǒng)么?
題解
https://github.phodal.com/
分析
企業(yè)開發(fā)大部分都是團隊協(xié)同而非單兵作戰(zhàn),很多人要同時編寫同一個項目的代碼,那么如何保證代碼的同步、減少沖突、查看改動呢?這就需要使用版本控制系統(tǒng),目前最主流的是 Git。
如今,Git 已經(jīng)是程序員的必修課了,但很多同學只是草草了解幾個簡單的 Git 操作,比如上傳和更新代碼到 GitHub,這是不行的。在工作中,還經(jīng)常會用到工作區(qū)、分支、合并、回退、解決沖突的功能,也必須知道如何操作。
順帶一提,大多數(shù)員工剛進公司要做的事就是用 Git 拉取代碼,如果連這個都不會,就真的很尷尬了。
架構(gòu)
面試題
什么是微服務?和傳統(tǒng)架構(gòu)有什么區(qū)別?
題解
https://www.zhihu.com/question/55511712
分析
如今的架構(gòu)形式豐富多彩,早就不是一套架構(gòu)吃遍天的時代了。單點、集群、分布式、SOA、微服務、容器、云原生、服務網(wǎng)格,這些架構(gòu)都有什么特點?分別適用于哪些場景?如何選擇?如何實現(xiàn)?這些問題都是后端程序員需要考慮、學習和實踐的。
聽完我這一通分析,一向囂張的小阿巴竟也變得沉默了,點了個 贊 就放下了手機。
想學好后端進大廠,真的是任重而道遠,大家加油!
我是魚皮,最后再送大家一些 幫助我拿到大廠 offer 的學習資料:
跑了,留下 6T 的資源!
歡迎閱讀 我從 0 自學進入騰訊的編程學習、求職、考證、寫書經(jīng)歷,不再迷茫!
我學計算機的四年,共勉!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的15 道超经典大厂 Java 面试题!重中之重的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 55个好习惯可令世界更美好(2)
- 下一篇: 老弟做了个网盘,炸了!