前言: 樓主畢業三年,從大學時期就開始一直從事java web方面的開發。我在去年的今天有一篇帖子:兩年java面試經驗。經歷了一年的上班,成長了很多。今年因為某些原因辭職了。從2月底辭職,到3月初,大概花了半個月的時間,面試了很多家公司,其中包括:阿里、京東、去哪兒、美團、攜程等互聯網公司,在此分享一下面試的經驗,整理一下三年的java web的開發面試經驗,希望能給廣大的網友朋友一些參考,大家共同進步:
1:手寫一個單例模式(雙重檢查鎖機制)
2:volatile是如何實現變量可見的?用到了哪些指令?工作內存和主內存解決了什么問題?以及他們之間的交互過程
3:jvm如何調優?寫幾個參數出來?嘗試設計一個自己的JVM,你會如何設計?
4:dubbo的group怎么用?超時時間設置的作用域有哪些?優先級是什么?
5:ThreadLocal底層如何實現?map中的key是什么?vlaue是什么?需要解決什么問題?哪個方法可以防止內存泄露
6:講一下currentHashMap的get方法過程,如何鏈表轉紅黑樹?
7:有一個表t1,列為ABC,索引為AC,現在select xx from table where c=xx a =xx有沒有用到索引?
8:cas是什么?給你筆畫一下具體的實現過程?cas什么時候結束?
9:java的鎖存儲在哪?占幾個比特位?鎖是如何升級的?
10:redis的緩存淘汰策略有哪些?LRU和LFU區別,手寫一個LRU
11:寫出線程池的核心參數,並解釋,然后說明線程池是有哪些放棄策略?
12:http屬於什么層協議?與https的區別是什么?Tcp協議屬於那一層?OSI七層網絡模型有哪些?三次握手和四次揮手的過程?為什么握手要三次,揮手要四次?
13:線上cpu占用率高怎么辦?如何排查這個問題,用哪些命令
14:spring使用了哪些設計模式?BeanFactory和Factory的區別是什么?
15:策略模式的使用場景?說一下它的優點和缺點?
16:給你一個秒殺場景,如何應對短時間的高峰請求問題?數據庫如何防止並發問題?秒殺如何實現不同的客戶端的時間一致性?
17:redis的基本數據類型有哪些?hash的使用場景?如何通過redis實現一個阻塞隊列?
18:畫出dubbo的調用關系圖?並舉例說明調用鏈
19:cas是什么?解釋一下cas的原理。並用筆畫出來,aba問題怎么解決?
20:你們的線程池是如何配比的?默認的線程數是多少?寫出線程池的幾個參數,並結合你們的項目解釋一下是如何調優的?
21:sring的事務用過嗎?簡述一下如何使用?當方法A使用了事務,方法B也使用了事務,他們的事務策略都是:如果沒有新的事務就開啟一個事務,問調用過程中事務是如何傳播的?
22:給你一串連續的數字,1到10000,隨機除去兩個數,怎樣快速找到這兩個數?
23:tomcat的IO框架經歷了怎樣的變化?談談你對NIO流的理解?
24:redis的緩存策略有哪些?手動寫一下LRU的實現方法,並介紹一下LFU
25:redis的集群是如何找到具體的key的?你們的集群采用哪種持久化策略?為什么?集群搭建模式是什么?
26:一串有負數和正數的數字,用算法實現連續的數字加起來的和最大的一串數字?
27:hashmap為什么是線程不安全的?線程安全的有哪些集合?講一下集合框架,包括map和list
28:秒殺場景下如何實現分布式鎖?redis搭建的集群會存在並發問題嗎?怎么解決?
29:目前jdk用的垃圾回收器是什么?講一講垃圾回收的內存划分?引用鏈可達是從哪里開始回收的?擴展:職責鏈模式
30:java有哪些加載器?Java的類加載機制是什么?雙親委派機制是什么?有什么好處?我如果想自定義一個名為Object的類,如何加載它?
31:你知道哪些設計模式?在項目中用到了哪些設計模式?講一講具體的應用場景和實現方式
32:redis集群是把數據存儲在所有節點嗎?如果是存儲一個節點?它怎么知道存儲到哪個節點?當master節點掛了,緩存是不是就刪除了?增加一個節點或者刪除一個節點,集群會怎么處理?
33:方法前如果不聲明private、public,那么是什么?它的級別是什么?
34:有沒有線上調優JVM的經驗?如何打印gc細節?
35:把你知道的GC算法都說一下,虛擬機經歷了怎樣的變化才發展到今天?
36:你做了什么項目?有哪些功能?有什么優勢?解決了什么問題?你認為還有那些優化的點?
37:什么是可重入鎖?假如我一個線程申請了可重入鎖,那么子線程可以再次用到可重入鎖嗎?
38、jvm的內存結構是什么樣的?請畫出來並且是哪些是線程共享的?哪些是線程私有的?
39、雙向升序鏈表的插入和刪除(筆試)
40、二維數組的遍歷和賦值(筆試)
42、算法:一個公司找獵頭拿簡歷 1000份,每個獵頭需要的佣金一樣,但每個獵頭擁有的簡歷數不相同(可能重復) ,問公司如何能雇佣最少的獵頭找到更多的簡歷
42、 接口限流策略有哪些
43、微服務雪崩后怎么處理的?
44、多線程環境,線程如何同步?
45、用多線程統計1到1000000之間有多少個素數,並輸出素數(假設cpu有四核)(機試)
46、用java實現各訂單生成器,需要考慮可讀、並發、不可重復(機試)
47、歸並排序(機試)
48、rabbitmq消息重復和丟失如何處理?
49、一個部分有序的數組,如何找到一個指定的數字?要求時間復雜度不能超過log(n)
50: hystrix如何實現服務降級、治理、熔斷,講一講微服務中服務熔斷的過程?你們都是怎么處理的?
51:mysql的limit查詢如何進行優化?索引遵循什么原則?
52:ElasticSearch了解嗎?ElasticsSearch如何計算評分?評分公式寫出來,有哪些查詢命令?
53:微服務的事務你們用什么解決?事務的傳播機制,方法A調用方法B,方法A有事務,問調用方法B還會有事務嗎?
總結: 看一下兩年的面試和三年的面試,有一個很明顯的變化是:目前市場對三年的要求不僅重視深度,並且重視廣度。大公司對於的算法的重視程度基本是首位的。現在的面試都不僅僅讓你回答,更是讓你用筆寫出來,給面試官解釋清楚問題。所以如果是很模糊的話,就基本沒戲了。也包括一些機試題,三年的技術總結更加重視於高並發的處理,包括不限於消息隊列、鎖、redis、mysql、jvm、事務、微服務的考察都是互聯網公司必面試的,所以不僅要臨時抱好佛腳,更要重視平時在工作中的積累。2019年是個行情很差的年份,很多人出去找工作好幾個月最終都無功而返。但我不唱衰行業,任何時候都是優勝略汰制,就業環境差了,但是作為一名開發,技術才是考量你的第一因素(當然我的意思不是唯技術論,情商和素質、與同事相處也同等重要),路漫漫其修遠兮,大家共勉加油吧。
再次送上福利:加java技術群:618626589 ,群資料里有,隨時可下載(群內無任何廣告和推銷培訓,博主是自學過來的,推薦自學的朋友一起交流技術)ps:為什么我要建自己的群:博主也加了很多群,大部分都是在閑扯,斗圖,無聊的話題,我選擇自己創建一個純技術交流群,旨在創建一個干凈的交流環境,歡迎各位高手或者新手加入!