算法複習

那技術人究竟都須要修煉哪些「內功」呢?我以爲,無外乎就是大學裏的那些基礎課程,操做系統、計算機網絡、編譯原理等等,固然還有數據結構和算法
做爲業務開發,咱們會用到各類框架、中間件和底層系統,好比 Spring、RPC 框架、消息中間件、Redis 等等。在這些基礎框架中,通常都揉和了不少基礎數據結構和算法的設計思想
這裏面有 10 個數據結構:數組、鏈表、棧、隊列、散列表、二叉樹、堆、跳錶、圖、Trie 樹;10 個算法:遞歸、排序、二分查找、搜索、哈希算法、貪心算法、分治算法、回溯算法、動態規劃、字符串匹配算法。java

時間複雜度
大 O 時間複雜度實際上並不具體表示代碼真正的執行時間,而是表示代碼執行時間隨數據規模增加的變化趨勢,因此,也叫做漸時間複雜度mysql

時間複雜度分析方法
一、只關注循環執行次數最多的一段代碼(n的量級就是要分析的時間複雜度)
二、總的時間複雜度就等於量級最大的那段代碼的時間複雜度(常量不算)
三、乘法法則:嵌套代碼的複雜度等於嵌套內外代碼複雜度的乘積linux

時間複雜度分類
粗略分爲多項式量級和非多項式量級
非多項式:當數據規模 n 愈來愈大時,非多項式量級算法的執行時間會急劇增長,求解問題的執行時間會無限增加。因此,非多項式時間複雜度的算法實際上是很是低效的算法
指數階(2的n次方)、階乘階O(n!)
多項式:
常量階O(1):常量級時間複雜度的一種表示方法。只要代碼的執行時間不隨 n 的增大而增加,這樣代碼的時間複雜度咱們都記做 O(1)。或者說,通常狀況下,只要算法中不存在循環語句、遞歸語句,即便有成千上萬行的代碼,其時間複雜度也是Ο(1)。
對數階O(logn)
線性階O(n)
線性對數階O(nlogn)
平方階O(n的平方),O(n的三次方).....O(n的k次方)nginx

空間複雜度
空間複雜度全稱就是漸進空間複雜度,表示算法的存儲空間與數據規模之間的增加關係(常見的空間複雜度就是 O(1)、O(n)、O(n的2次方)),通常分析起來比較簡單面試

最好狀況時間複雜度就是,在最理想的狀況下,執行這段代碼的時間複雜度
最壞狀況時間複雜度就是,在最糟糕的狀況下,執行這段代碼的時間複雜度
平均狀況時間複雜度
只有同一塊代碼在不一樣的狀況下,時間複雜度有量級的差距,咱們才須要分析最好、最好和平均時間複雜度
均攤時間複雜度(一種特殊的平均)
對一個數據結構進行一組連續操做中,大部分狀況下時間複雜度都很低,只有個別狀況下時間複雜度比較高,並且這些操做之間存在先後連貫的時序關係,這個時候,咱們就能夠將這一組操做放在一起分析,看是否能將較高時間複雜度那次操做的耗時,平攤到其餘那些時間複雜度比較低的操做上。並且,在可以應用均攤時間複雜度分析的場合,通常均攤時間複雜度就等於最好狀況時間複雜度redis

 

數組
數組(Array)是一種線性表數據結構。它用一組連續的內存空間,來存儲一組具備相同類型的數據。對內存的要求比較高
隨機訪快,刪除和插入慚怍低效,由於要保證連續來作數據搬移
數組和鏈表的區別:「鏈表適合插入、刪除,時間複雜度 O(1);數組適合查找,根據下標隨機訪問的時間複雜度爲 O(1)」
數組插入優化:若是數組數據有序,則須要插入到k位置,k及之後的都要日後移動,若是數組數據無序,只需將數組k位置的數據移動至數組末尾,k位置放入新數據,時間複雜度從O(n)降爲了O(1)
數組刪除優化:若是要刪除好幾個數據,能夠把要刪除的數據都記下來,當數組沒有存儲空間後,把標記的數據真正的都刪掉,再總體移動數據,(JVM中標記清除垃圾回收算法)
若是事先能肯定須要存儲的數據大小,最好在建立 ArrayList 的時候事先指定數據大小
ArrayList和數組區別:ArrayList不能存儲基本數據類型(int,long),而 Autoboxing、Unboxing 則有必定的性能消耗,因此若是特別關注性能,或者但願使用基本類型,就能夠選用數組;若是數據大小事先已知,而且對數據的操做很是簡單,用不到 ArrayList 提供的大部分方法,也能夠直接使用數組。
線性表就是數據排成像一條線同樣的結構。每一個線性表上的數據最多隻有前和後兩個方向。其實除了數組,鏈表、隊列、棧等也是線性表結構。非線性表,好比二叉樹、堆、圖等。之因此叫非線性,是由於,在非線性表中,數據之間並非簡單的先後關係。算法

鏈表
鏈表不須要一塊連續的內存空間,它經過「指針」將一組零散的內存塊串聯起來使用,每一個內存空間叫作」節點「,每一個節點有」後繼指針「記錄下個節點的地址,第一個節點叫作頭結點,最後一個節點叫作尾節點。spring

單鏈表
頭結點用來記錄鏈表的基地址,而尾結點特殊的地方是:指針不是指向下一個結點,而是指向一個空地址 NULL,表示這是鏈表上最後一個結點。
鏈表刪除和插入時間複雜度O(1),查找k元素時間複雜度O(n)sql

循環鏈表
循環鏈表是一種特殊的單鏈表,而循環鏈表的尾結點指針是指向鏈表的頭結點
環形結構能夠用循環鏈表實現(例如:約瑟夫問題)mongodb

雙向鏈表
它支持兩個方向,每一個結點不止有一個後繼指針 next 指向後面的結點,還有一個前驅指針 prev 指向前面的結點。
優勢:和單項鍊表比,雙向鏈表能夠支持 O(1) 時間複雜度的狀況下找到前驅結點,
缺點:和單向鏈表比,雙向鏈表每一個節點多了一個前驅指針,因此耗費空間多
雙向鏈表比單向應用更普遍(例如:LinkedHashMap)
緣由:一、刪除或插入一個節點k時,單向須要找前驅節點,雙向找到k後能夠直接刪除或插入
二、針對有序鏈表,在查找上雙向鏈表效率更高,由於查找k能夠經過已知位置q和k比較,雙向能夠往前或者日後找一半數據
4.如何選擇?
數組簡單易用,在實現上使用連續的內存空間,能夠藉助CPU的緩衝機制預讀數組中的數據,因此訪問效率更高,而鏈表在內存中並非連續存儲,因此對CPU緩存不友好,沒辦法預讀。
若是代碼對內存的使用很是苛刻,那數組就更適合,由於鏈表會多佔用一個指針的空間,內存消耗會翻倍,對鏈表進行頻繁的插入、刪除操做,還會致使頻繁的內存申請和釋放,容易形成內存碎片,若是是 Java 語言,就有可能會致使頻繁GC.
數組的缺點是大小固定,一經聲明就要佔用整塊連續內存空間,聲明過大可能沒有那麼大連續內存,太小需申請更大的空間,把數組拷貝到新數組中,數據拷貝很耗時。鏈表自己沒有大小限制,支持自然動態擴容



後進者先出,先進者後出,這就是典型的「棧」結構。棧是一種「操做受限」的線性表,只容許在一端插入和刪除數據
實際上,棧既能夠用數組來實現,也能夠用鏈表來實現。用數組實現的棧,咱們叫做順序棧,用鏈表實現的棧,咱們叫做鏈式棧
棧:瀏覽器的前進後退,計算器的運算,判斷括號是否匹配


隊列
先進者先出,這就是典型的「隊列」。
咱們知道,棧只支持兩個基本操做:入棧 push()和出棧 pop()。隊列跟棧很是類似,支持的操做也頗有限,最基本的操做也是兩個:入隊 enqueue(),放一個數據到隊列尾部;出隊 dequeue(),從隊列頭部取一個元素
隊列跟棧同樣,也是一種操做受限的線性表數據結構。
用數組實現的隊列叫做順序隊列,用鏈表實現的隊列叫做鏈式隊列。
隊列:普通隊列,循環隊列,阻塞隊列
阻塞隊列其實就是在隊列基礎上增長了阻塞操做。簡單來講,就是在隊列爲空的時候,從隊頭取數據會被阻塞。尚未數據可取,直到隊列中有了數據才能返回;若是隊列已經滿了,那麼插入數據的操做就會被阻塞,直到隊列中有空閒位置後再插入數據,而後再返回。
前面咱們講了阻塞隊列,在多線程狀況下,會有多個線程同時操做隊列,這個時候就會存在線程安全問題,那如何實現一個線程安全的隊列呢?
線程安全的隊列咱們叫做併發隊列。最簡單直接的實現方式是直接在 enqueue()、dequeue()方法上加鎖,可是鎖粒度大併發度會比較低,同一時刻僅容許一個存或者取操做。實際上,基於數組的循環隊列,利用 CAS 原子操做,能夠實現很是高效的併發隊列。這也是循環隊列比鏈式隊列應用更加普遍的緣由。在實戰篇講 Disruptor 的時候,我會再詳細講併發隊列的應用。

實際上,對於大部分資源有限的場景,當沒有空閒資源時,基本上均可以經過「隊列」這種數據結構來實現請求排隊。
好比高性能隊列 Disruptor、Linux 環形緩存,都用到了循環併發隊列;Java concurrent 併發包利用 ArrayBlockingQueue 來實現公平鎖等。
關於如何實現無鎖併發隊列
可使用 cas + 數組的方式實現。

隊列的其餘應用
分佈式消息隊列,如 kafka 也是一種隊列。

散列表
散列表用的是數組支持按照下標隨機訪問數據的特性,因此散列表其實就是數組的一種擴展,由數組演化而來。能夠說,若是沒有數組,就沒有散列表。

散列表三個重要因素,散列key(關鍵字)、散列函數(hash(key)),計算出來的值是散列值

散列函數的三個要求
一、計算出來的散列值是非負整數
二、若是 key1 = key2,那 hash(key1)== hash(key2);
三、若是 key1 ≠ key2,那 hash(key1) ≠ hash(key2)。

要求合理,可是第三點很難作到,也沒法徹底避免這種散列衝突。並且,由於數組的存儲空間有限,也會加大散列衝突的機率


散列衝突
解決散列衝突的方法,有兩類,開放尋址法(open addressing)和鏈表法(chaining)
一、開放尋址方法
開放尋址法的核心思想是,若是出現了散列衝突,咱們就從新探測一個空閒位置,將其插入
探測的方法
線性探測:線性探測法其實存在很大問題。當散列表中插入的數據愈來愈多時,散列衝突發生的可能性就會愈來愈大
二次探測(Quadratic probing)和雙重散列(Double hashing)。
雙重散列:咱們先用第一個散列函數,若是計算獲得的存儲位置已經被佔用,再用第二個散列函數,依次類推,直到找到空閒的存儲位置。

無論是哪一種探測方法,當散列表中位置很少的時候,散列衝突會大大的增長,因此會提供一個裝載因子(load factor)來表示空位的多少

鏈表法是一種更加經常使用的散列衝突解決辦法,相比開放尋址法,它要簡單不少。咱們來看這個圖,在散列表中,每一個「桶(bucket)」或者「槽(slot)」會對應一條鏈表,全部散列值相同的元素咱們都放到相同槽位對應的鏈表中。


散列表兩個核心問題是散列函數設計和散列衝突解決

Java 中 LinkedHashMap 就採用了鏈表法解決衝突,ThreadLocalMap 是經過線性探測的開放尋址法來解決衝突
我總結一下,當數據量比較小、裝載因子小的時候,適合採用開放尋址法。這也是 Java 中的ThreadLocalMap使用開放尋址法解決散列衝突的緣由。
我總結一下,基於鏈表的散列衝突處理方法比較適合存儲大對象、大數據量的散列表,並且,比起開放尋址法,它更加靈活,支持更多的優化策略,好比用紅黑樹代替鏈表。


哈希函數
將任意長度的二進制值串映射爲固定長度的二進制值串,這個映射的規則就是哈希算法,而經過原始數據映射以後獲得的二進制值串就是哈希值
三種哈希算法在分佈式系統中的應用,它們分別是:負載均衡、數據分片、分佈式存儲。

在負載均衡應用中,利用哈希算法替代映射表,能夠實現一個會話粘滯的負載均衡策略。在數據分片應用中,經過哈希算法對處理的海量數據進行分片,多機分佈式處理,能夠突破單機資源的限制。在分佈式存儲應用中,利用一致性哈希算法,能夠解決緩存等分佈式系統的擴容、縮容致使數據大量搬移的難題。

 

一個優秀的散列表
散列函數的設計不能太複雜。過於複雜的散列函數,勢必會消耗不少計算時間,也就間接的影響到散列表的性能
散列函數生成的值要儘量隨機而且均勻分佈,這樣才能避免或者最小化散列衝突

 

 

 

 

 

 

 

索引的出現其實就是爲了提升數據查詢的效率,就像書的目錄同樣

能夠提升讀寫速度的數據結構:哈希表、有序數組和搜索樹

哈希表這種結構適用於只有等值查詢的場景,查詢區間就要遍歷全表
有序數組在等值查詢和範圍查詢場景中的性能就都很是優秀,查找能夠二分查找,單看查詢效率有序數組很棒,可是插入和刪除須要移動數組,成本過高
因此,有序數組索引只適用於靜態存儲引擎,好比城市人口信息,不會更改的數據
二叉搜索樹的特色是:每一個節點的左兒子小於父節點,父節點又小於右兒子
二叉樹是搜索效率最高的,可是實際上大多數的數據庫存儲卻並不使用二叉樹。其緣由是,索引不止存在內存中,還要寫到磁盤上。二叉樹數據量大的時候樹比較高,訪問磁盤過多
N 叉樹因爲在讀寫上的性能優勢,以及適配磁盤的訪問模式,已經被普遍應用在數據庫引擎中了。


不一樣存儲引擎索引實現不同,由於索引是在存儲引擎層實現的
InnoDB 的索引模型
在 InnoDB 中,表都是根據主鍵順序以索引的形式存放的,這種存儲方式的表稱爲索引組織表
InnoDB 使用了 B+ 樹索引模型,因此數據都是存儲在在 B+ 樹中的。每個索引在 InnoDB 裏面對應一棵 B+ 樹。
InnoDB用B+樹的緣由:B+ 樹可以很好地配合磁盤的讀寫特性,減小單次查詢的磁盤訪問。
主鍵索引的葉子節點存的是整行數據。在 InnoDB 裏,主鍵索引也被稱爲聚簇索引(clustered index)。
非主鍵索引葉子節點內容是主鍵的值。在 InnoDB 裏,非主鍵索引也被稱爲二級索引(secondary index)。

基於主鍵索引和普通索引的查詢有什麼區別?
主鍵查詢方式,只須要搜索ID這棵B+樹
普通索引查詢方式,則須要先搜索 k 索引樹,獲得 ID 的值,再到 ID 索引樹搜索一次。這個過程稱爲回表。
因此更推薦主鍵索引,少查一次樹

從性能和存儲空間方面考量,自增主鍵每每比業務邏輯字段作主鍵更好
緣由:
性能:自增主鍵有序,業務字段無序,每次插入中間須要挪動位置,插入若是頁滿了,會引發頁3分裂,刪除數據,可能有頁合併
存儲:主鍵長度越小,普通索引的葉子節點就越小,普通索引佔用的空間也就越小,

若是隻有一個索引這種狀況,用業務字段做爲主鍵比較好,由於能夠少查一次樹


覆蓋索引:因爲覆蓋索引能夠減小樹的搜索次數,顯著提高查詢性能,因此使用覆蓋索引是一個經常使用的性能優化手段。例如:select ID from T where k between 3 and 5 代替 select * 減小了回表
B+ 樹這種索引結構,能夠利用索引的「最左前綴」,來定位記錄
前綴索引:能夠看到,不僅是索引的所有定義,只要知足最左前綴,就能夠利用索引來加速檢索。這個最左前綴能夠是聯合索引的最左 N 個字段,也能夠是字符串索引的最左 M 個字符。
第一原則是,若是經過調整順序,能夠少維護一個索引,那麼這個順序每每就是須要優先考慮採用的
索引下推:而 MySQL 5.6 引入的索引下推優化(index condition pushdown), 能夠在索引遍歷過程當中,對索引中包含的字段先作判斷,直接過濾掉不知足條件的記錄,減小回表次數。

 

 

分佈式(distributed)是指多臺不一樣的服務器部署不通的服務模塊,經過遠程調用協議協同工做,對外提供服務
分佈式思想,經過把意見大的事情,拆分紅多個小事情,分別交給不一樣的人作
集羣(cluster)是指在多臺不一樣的服務器中部署相同應用或服務模塊,構成一個集羣,經過負載均衡設備對外提供服務

rpc是指計算機A上的進程,調用另一臺計算機B上進程,其中A上的調用進程唄掛起,而B上的被調用進程開始執行,當值返回給A時,A進程繼續執行,調用方能夠經過使用使用參數講信息傳送給被調用方,然後能夠經過傳回的結果獲得信息

RPC框架主要三個角色,Provider、Consumer,Registry,服務提供者啓動後會主動向註冊中心註冊機器ip,port以及提供的服務列表,服務消費者啓動時向註冊中心獲取服務提供地址列表,可實現軟負載均衡和Failover

rpc設計技術
動態代理技術:java原生,CgLib,javassist
序列化
java原生序列化,效率低,開源的,protobuf,Thrift,hession,Kryo,Msgpack
NIO
RPC框架都直接基於netty這一IO通訊框架,好比HSF,dubbo,Hadoop Avro,推薦使用Netty做爲底層通訊框架
服務註冊中心
可選技術:Redis,Zookooper,Consul,Etcd

RPC開源框架
Dubbo 阿里
Motan 新浪微博
gRPC Google開發的高性能、通用的開源RPC框架,主要面向移動端,基於HTTP/2協議標準,基於ProtoBuf序列化協議開發,支持衆多開發語言,自己不是分佈式的,須要實現框架愛功能
thrift Apache的一個跨語言的高性能服務框架

 

 

 

 

 

一、介紹一下mysql索引?爲何用B+樹
索引(Index)是幫助MySQL高效獲取數據的數據結構
MYsql經常使用索引有,主鍵索引、惟一索引、普通索引、全文索引、組合索引
不能創建過多索引,可能會致使磁盤和內存佔用太高,從而影響總體性能
mysql經常使用的INnoDB數據庫使用B+tree實現的

數據增大,索引自己增大,不能所有存在內存中,索引已索引文件存儲在磁盤上,這樣索引查找會產生磁盤i/O消耗,相對於內存存取,I/O存取消耗要高不少個數量級,若是數據量上百萬的節點二叉樹深度很深,這麼深度的二叉樹,每讀取一個節點,須要一次I/O,總體消耗很高,減小存取次數,減小樹的深度,把二叉樹變成多路索引樹
B+Tree就是一種多路索引數,mysql將節點大小設置爲頁的整數倍,利用了磁盤預讀原理,

 

二、Java類加載機制,雙親委派模型的好處
通常來講,咱們把 Java 的類加載過程分爲三個主要步驟:加載、連接、初始化
首先是加載階段(Loading),它是 Java 將字節碼數據從不一樣的數據源讀取到 JVM 中,並映射爲 JVM 承認的的數據結構(Class 對象),這裏的數據源多是各類各樣的形態,如 jar 文件、class 文件,甚至是網絡數據源等;若是輸入數據不是 ClassFile 的結構,則會拋出 ClassFormatError。
加載階段是用戶參與的階段,咱們能夠自定義類加載器,去實現本身的類加載過程。
第二階段是連接(Linking),這是核心的步驟,簡單說是把原始的類定義信息平滑地轉化入 JVM 運行的過程當中。這裏可進一步細分爲三個步驟:
驗證(Verification),這是虛擬機安全的重要保障,JVM 須要覈驗字節信息是符合 Java 虛擬機規範的,不然就被認爲是 VerifyError,這樣就防止了惡意信息或者不合規的信息危害 JVM 的運行,驗證階段有可能觸發更多 class 的加載。
準備(Preparation),建立類或接口中的靜態變量,並初始化靜態變量的初始值。但這裏的「初始化」和下面的顯式初始階段是有區別的,側重點在於分配所須要的內存空間,不會去執行更進一步的 JVM 指令。
解析(Resolution),在這一步會將常量池中的符號引用(symbolic reference)替換爲直接引用。在Java 虛擬機規範中,詳細介紹了類、接口、方法和字段等各個方面的解析。
最後是初始化階段(initialization),這一步真正去執行類初始化的代碼邏輯,包括靜態字段賦值的動做,以及執行類定義中的靜態初始化塊內的邏輯,編譯器在編譯階段就會把這部分邏輯整理好,父類型的初始化邏輯優先於當前類型的邏輯。
再來談談雙親委派模型,簡單說就是當類加載器((Class-Loader)試圖加載某個類型的時候,除非父加載器找不到相應類型,不然儘可能將這個任務代理給當前加載器的父加載器去作。使用委派模型的目的是避免重複加載 Java 類型

三、java線程啓動的幾種方式?線程池使用,拒絕策略
三種:繼承Thread類、實現Runnable接口、使用ExecutorService、Callable、Future實現有返回結果的多線程。其中前兩種方式線程執行完後都沒有返回值,只有最後一種是帶返回值的。

(1)與鎖相比,使用比較交換(下文簡稱CAS)會使程序看起來更加複雜一些。但因爲其非阻塞性,它對死鎖問題天生免疫,而且,線程間的相互影響也遠遠比基於鎖的方式要小。更爲重要的是,使用無鎖的方式徹底沒有鎖競爭帶來的系統開銷,也沒有線程間頻繁調度帶來的開銷,所以,它要比基於鎖的方式擁有更優越的性能。
(2)無鎖的好處:
第一,在高併發的狀況下,它比有鎖的程序擁有更好的性能;
第二,它天生就是死鎖免疫的。
CAS(Compare And Swap):指的是CPU所支持的一種特殊指令,該指令對內存中的共享數據作原子性的讀寫操做,也叫作「比較交換」

四、Spring bean的生命週期?默認建立的模式是什麼?不想單例怎麼辦?

五、HashMap和HashTable以及CocurrentHashMap詳細說明

六、java線程變量怎麼實現?內存模型?

七、說一下aop

八、java裏的鎖瞭解哪些?說了Lock和synchronized

可重入鎖:在執行對象中全部同步方法不用再次得到鎖
可中斷鎖:在等待獲取鎖過程當中可中斷
公平鎖: 按等待獲取鎖的線程的等待時間進行獲取,等待時間長的具備優先獲取鎖權利
讀寫鎖:對資源讀取和寫入的時候拆分爲2部分處理,讀的時候能夠多線程一塊兒讀,寫的時候必須同步地寫

九、java棧何時會發生內存溢出?Java堆呢

十、寫代碼模擬,50我的,2個窗口排隊買票

11,無序數列中求第k大的數


al
一面
一、自我介紹和項目

二、java的內存分區

三、java對象的回收方式,回收算法

四、CMS和G1瞭解嗎,CMS解決了什麼問題,說一下回收的過程

五、CMS回收停頓了幾回,爲何要停頓兩次

六、java棧何時回發生內存溢出,java堆呢,說一種場景,我說集合類持有對象

七、那集合類如何解決這個問題呢,我說用軟引用和弱引用,那你講講這兩個引用的區別吧

八、java鎖瞭解哪些,說了Lock和synchronized

九、他們的使用的方式和實現原理有什麼區別呢

十、synchronized鎖升級的過程,說了偏向鎖到輕量級再到重量級鎖,而後爲我他們分別是怎麼實現的,解決得我是哪些問題,何時回發生鎖升級

十一、Tomcat瞭解嗎,說一下類加載器結構吧

12說了Spring,問我Spring中如何讓A和b兩個b順序加載

1三、10億個數去重,我說用了hash分片作,他說可能不均勻,而後我說了bitmap,他說那數字量更多怎麼辦,我說那就兩個bitmap吧,他說下一題吧


二面
一、講一下項目

二、作的主要是java對吧,講一下多線程吧,用到哪些寫一下

三、寫了thread和runnable,而後寫了線程池,又問了線程池由哪些組件組成,有哪些線程池,分別怎麼用,以及拒絕策略有哪些

四、何時多線程會發生死鎖,寫一個例子吧,而後我寫了 兩個線程,兩個鎖,分別持有一個,請求另外一個死鎖的實例

五、集合熟悉吧,寫一個題目,一個字符串集合,找出pdd而且刪除

六、而後說一下redis,是單線程仍是多線程,redis的分佈式怎麼作

七、rpc瞭解嗎,我說了主要是協議棧+數據格式+序列化方式,而後須要有服務註冊中心管理生產者和消費者

九、tcp三次握手的過程,若是沒有第三次握手有什麼問題

三面
一、自我介紹
二、cap瞭解嗎,分別指什麼,base呢,強一致性和弱一致性有什麼方法來作,apc瞭解嗎,說一下大體過程
三、負載均衡怎麼作到的呢,爲何這麼作
四、瞭解集羣雪崩嗎
五、mysql的主從複製怎麼作的,具體原理是什麼有什麼優缺點
六、redis有哪些線程模式,各自的區別
七、項目用到了多線程,若是線程數不少怎麼辦
八、分佈式瞭解哪些東西,消息隊列了解嗎,用在什麼場景
說了消峯,限流和異步,說了kafka,問我怎麼保證數據不丟失,以及怎麼確保消息不會被重複消費,還問了消息送達確認是怎麼作到的。
九、講一下項目的主要架構,你再裏面作了什麼
十、有什麼比較複雜的業務邏輯講一下
十一、最大的難點是什麼,收穫是什麼

 


一面
一面偏架構方面

一、介紹一下本身,講講項目經歷

二、大家項目中微服務是怎麼劃分的,劃分粒度怎麼肯定?

三、那在實踐微服務架構中,有遇到什麼問題麼?

四、大家在關於微服務間數據一致性問題,是如何解決的?

五、大家爲何不用其餘的MQ,最終選擇了RokcetMQ?

六、爲何RocketMQ沒有選擇ZooKeeper,而是本身實現了一個NameServer集羣?

七、嗯,理解的不錯,Zookeeper在選舉的過程當中,還能對外提供服務麼?

八、對Paxos算法瞭解多少?

九、若是讓你來設計一個春晚搶紅包架構,你會怎麼設計?

十、有什麼想問個人?

大概聊了40分鐘左右~

二面
二面有點偏底層和算法

一、扯了下項目、講一下項目經歷

二、大家用了redis,redis的底層數據結構瞭解多少?

三、知道動態字符串sds的優缺點麼?

注:sds爲redis底層數據結構之一

四、redis的單線程特性有什麼優缺點?

五、用過 Redis 的哪些數據結構, 分別用在什麼場景?

六、大家怎麼解決緩存擊穿問題的?

注:估計答了Hytrix

七、Hytrix的隔離機制有哪些?Hytrix常見配置是哪些?

八、本身作過哪些調優?JVM調優、數據庫調優都行!

九、給了個場景,問你怎麼調

十、一道算法題,具體題目忘了,在給出的連接中做答~

三面
一、講講本身基礎掌握狀況,以及項目經歷

二、平時會用到哪些數據結構?

三、鏈表和數組的優缺點?

四、解決hash衝突的方法有哪些?

五、講講本身對HashMap的理解,以及和Weakhashmap的區別?

六、你剛纔講的是JDK1.7版本的實現,知道JDK1.8作了哪些改動麼?

七、大家在微服務中用RPC通訊仍是REST?

八、RPC和HTTP的關係是什麼?

九、知道HTTP1.0和1.1的區別麼?

十、談談什麼是HTTP的長鏈接和短鏈接?

十一、TCP的三次握手和四次揮手,以及爲何要三次握手,而不是二次?

十二、TCP 有哪些狀態,相應狀態的含義

1三、讓你評價一下你本身?

而後問了下面試官還有幾輪,面試官說不必定!

四面
一、依然是介紹本身

二、大家數據庫的高可用架構是怎麼樣的?

三、如何保證數據庫主從一致性?

四、知道mysql的索引算法麼?

五、爲何mongodb的索引用了B樹,而mysql用B+樹?

六、用mysql過程當中,有遇到什麼問題麼?

七、大家生產用的是哪一種事務隔離級別,爲何?

八、談一談你對微服務架構的理解

九、你用過哪些RPC框架,講講他們優缺點

十、用過docker麼,對容器瞭解多少

十一、有什麼問個人?

HR面
問經歷,問離職緣由,問職業規劃,問待遇。

惟一比較奇葩的一個,竟然不問你指望薪水~~

 

 

 

 

初級開發而言,須要讓面試官感受出以下的要點。

1. 熟悉SSM架構,至少在項目裏作過。

這個的說法是,介紹項目時,用一個業務流程來講spring mvc如何作的。

2. 知道Spring MVC中的細節,好比@Autowired的用法,如何把url映射到Controller上,ModelAndView對象返回的方式等。

3. 最好結合項目的用法,說下你是怎麼用AOP,攔截器的,好比說能夠經過攔截器攔截非法請求,怎麼用 AOP輸出日誌等。

4. 關於ORM方面,不限用過哪一種,但得知道一對一,一多多,多對多等的用法,以及cascade和inverse的用法。

5. 最好知道聲明式事務的作法。

若是你要應聘高級開發,那在上述基礎上,最好了解以下的知識點:

Spring Bean的週期
最好能經過閱讀源代碼,說下IOC,AOP以及Spring MVC的工做流程
最好能結合反射,說下IOC等的實現原理
Spring Boot和Spring Cloud的一些知識點

四. 數據庫方面須要準備的點

很多候選人會看不少SQL的技巧,好比select該怎麼寫,insert又該怎麼寫,但僅限於此,不會再準備其它的。

這樣就很吃虧,由於面試官會認爲,哪怕是初級開發,SQL語句也該會寫,因此這塊不會多問,而會問以下方面的問題。

1. 索引怎麼建的,怎麼用的?好比我建好了一個索引,在where 語句裏寫 name like '123%'會不會走索引,怎麼狀況下不應建索引,哪些語句不會走索引。

2. 除了索引以外,你有過哪些SQL優化方面的經驗,好比分庫分表,或經過執行計劃查看SQL的優化點。這最好是能結合你作的項目實際來說。

這裏,我面試下來,大概有70%的候選人只知道基本SQL的寫法,因此哪怕你是隻有理論經驗,會說一些優化點,也是很是有利的。

這塊對於高級開發而言,更得了解優化方面的技能。

五. Java Core方面須要準備的點

這塊是基礎,其實不少問的問題,候選人必定會在項目裏用到,但不多能說好說全。

這塊主要會從集合,多線程,異常處理流程以及JVM虛擬機這些方面來問。

集合方面:

1. hashcode有沒有重寫過?在什麼場景下須要重寫。若是能夠,結合hash表的算法,說下hashmap的實現原理。

對於高級開發而言,最好經過ConcurrentHashMap來講明下併發方面的底層實現代碼。

2. ArrayList,LinkedList的差異,好比一個基於數組,一個基於鏈表,它們均是線程不安全的,ArrayList的擴容作法等。

對於高級而言,最好看下底層的代碼。

3. Set如何實現防重的,好比TreeSet和HashSet等。

4. Collection的一些方法,好比比較方法,包裝成線程安全的方法等。

5. 可能有些面試官會問,如何經過ArrayList實現隊列或堆棧,這個能夠準備下。

多線程方面,其實在項目裏不怎麼會用到,但會問以下的問題:

1. synchronized和可重入鎖的差異,而後可能會順便問下信號量等防併發的機制。

2. 在線程裏該如何返回值,其實就是callable runnable 區別。

3. 必定得經過ThreadLocal或volatile關鍵字,來講明線程的內存模型。

4. 線程池方面,會用,瞭解些經常使用參數

線程方面,可能問得比較多的就是併發機制,若是是高級開發,可能會問得深些。

虛擬機方面

1. 結構圖和流程能夠大體說下。

2. 必定得了解針對堆的垃圾回收機制,具體而言,能夠畫個圖,說下年輕代年老代等。

3. 說下垃圾回收的流程,而後針對性地說下如何在代碼中優化內存性能。

4. 最好說下若是出現了OOM異常,該怎麼排查?如何看Dump文件。

5. GC的一些概念,好比強弱軟引用,finalize方法等,這些能夠準備下。


架構方面

1. 能證實本身能夠幹活(這不難),同時能結合底層代碼說出IOC,AOP或Spring MVC的流程,只要能說出一個便可。或者能說出攔截器,Controller等的高級用法。

2. 能證實本身有Spring Boot或Spring Cloud的經驗,好比能說出些Spring Cloud組件的用法。

3. 若是能證實本身有分佈式開發的經驗,那最好了,其實這不難證實,好比能說出服務的包是放在多臺機器上(大多數公司其實都這樣),並且能說出如何部署,如何經過nginx等作到負載均衡。

數據庫方面,其實講清楚一個問題便可:如何進行SQL調優,好比經過索引,看執行計劃便可,若是有其它的優化點,說清楚便可。

Java Core方面,這裏給出些訣竅:

1. 能結合ConcurrentHashMap的源代碼,說出final,volatile,transient的用法,以及在其中如何用Lock對象防止寫併發。

2. 結合一個項目實際,說下設計模式的實踐。

3. 多線程方面,能說出Lock或volatile等高級知識點的用法。

4. 這塊最取巧:說下GC的流程,以及如何經過日誌和Dump文件排查OOM異常,若是再高級些的話,說下如何在代碼中優化內存代碼。

 

記憶比較深入的有:BIO NIO AIO
spring的aop怎麼實現
jdk和cglib的動態代理
jdk的動態代理與cglib代理
hashmap底層是啥
arraylist和vector的區別
是如何擴容的
若是想要使用hashmap又想線程安全怎麼辦
而後問我哪一個數據庫最熟
我說mysql 問 最經常使用的兩種存儲引擎
答 myisam 還有innodb
他們的區別在哪裏

 

 

 

一、兩個棧怎麼實現隊列
二、不用遞歸遍歷二叉樹
三、實現一個樹,深度層級差不超過1
四、ConcurrentMap原理
五、aop原理,實現接口是動態代理,不實現接口是xxlib
六、java8的新特性
七、等待隊列的幾種,怎麼實現的
八、redis是單線程仍是多線程,怎麼保證事務的一致性
如何實現分佈式鎖
悲觀鎖樂觀鎖應用原理
多線程(我以前就問通常多線程寫在哪)
session共享如何實現
上海也有問數據庫優化,還有一些深的索引,你用的技術底層原理
工廠模式什麼的
還有jdk你用的幾,8的話爲啥是他,有什麼不同和以前的比


leetcode和劍指offer刷完,牛客面試題刷完,bat確定穩的(什麼鬼)
牛客面試題刷完offer就能爆破你的郵箱了
會不會分佈式框架
spring運行流程
spring 原理

 

 

 

 

網易(劉)(2017.05)
先讓寫了個linux
統計一個日誌裏的ip的個數排
寫了兩種單例
寫了個工廠模式
寫了個冒泡和快排
還有個交換a和b的值,不用第三個變量
問了問redis,spring的aop和ioc
問了問map
數組那塊


王 (2017.05)
好多呢,開始時作dsp的一些,魅族,小廣告公司
有公司問過期間複雜度的問題
算法通常問怎麼實現的
jvm、垃圾回收什麼的
設計模式的具體實現什麼的

優酷 (2017.05)
寫一個隊列
問我引擎的總體架構(畫出來)
問我elk怎麼優化的,難點是什麼
jvm的內存結構,gc算法
他問我寫過spring註解嗎
懂原理嗎。問我知道redis消息隊列德原理嗎


雲杉 (2017.05)
Mapreduce
閉包
Java 8新特性
Iterable
什麼java8提高了哪些功能

說什麼百萬的用戶id,而後讓我實現什麼找到排名前十的
問我除了java還會什麼語言,還有grep sed awk 是幹什麼的,
還有問我jvm內存模型,和gc ,爲何要分代
還有hashmap arraylist linkedlist 的實現
最後出了一道題,讓我不斷優化啥的,還有範型
array list、toarray

除了java還會什麼語言

京東商城 (2017.05)

爲何離職
spring事物管理,或者說一說數據庫的事務管理四個特性,傳播和隔離
問我哪一個項目最熟悉、最近作的項目、訪問量是多少,有多少實例,解決過超時這些問題什麼的嗎,讓我具體說一說其中一個功能
redis和memchache的區別,memchache能存對象嗎
java裏面集合,和特性
多線程狀態轉換,生產者消費者寫一個,用在哪了
經常使用的設計模式,讓我說了說模板方法模式
用shell寫一個問題,一個累加的問題
有什麼問題須要問

爲何離職
cookiemapping的實現,設計整個cookiemapping服務
聯盟有哪些
引擎的框架
實現一個多個線程同時加加或減減
走的是rtb規範嗎
dmp的問題
elk優化過嗎
問我最熟悉的模塊
同步模塊的設計什麼的
有什麼問題須要問
hr
如今薪資多少,
指望薪資多少,
若是發offer能夠介紹如今公司的來嗎
在如今公司將來1-3年的發展
自我介紹
以爲本身憑什麼要那麼多工資
有什麼問題須要問

餓了麼
一面
1,自我介紹,
2,說一下我畫其中一個項目的架構,好比依賴什麼,
3,問我這個是一個系統作的仍是好幾個系統一塊兒作的,而後說其中一個項目定時拉取數據怎麼實現的,
4,問我用過的mq,
5,zk瞭解嗎,怎麼實現鎖一致性仍是啥玩意的,
6,問我redis怎麼實現訪問的,怎麼保證鎖一致的,
7,synccronrie 內部怎麼實現的,讓我寫了一個單例模式,而後說怎麼內部優化的,
8,redis用到的結構,
9,問我dubbo 怎麼實現兩個系統通信的
10.還問了我aop用過嗎,原理是啥
十一、單例模式寫一個,爲何用volitire。。。

展心展粒
問我關於項目裏面紅包的設計,還有問我有多少種排序,快拍的原理,知道的幾種數據結構
他說我快拍的原理說的不對,而後說我紅包的設計有點問題
沒能解決超賣的問題
而後問了我大概在公司作啥
紅包系統的難點
問我分佈式裏面數據一致性的問題,說我這個紅包設計師有問題的
問我快排的複雜度,歸併的複雜度,問我排序裏面哪些比較快
他問我redis爲啥可以多個用戶同時訪問還很快,分佈式鎖兩個同時去執行,會怎麼樣


字節跳動
一、怎麼設計一個udp的重傳機制
二、m長的線段分紅n段有多少種分法(算法)再不會的狀況下,寫leetcode第一題(鏈表翻轉)
三、hashmap和hashcode的區別,紅黑樹的時間複雜度
四、設計一秒殺系統,每一層具體能過濾多少流量
五、elk裏面作了什麼,日誌裏面的字段和es怎麼對應,keyword爲何比long快,long的存儲結構
六、客戶投訴你的系統太慢了怎麼辦,(主要考察系統怎麼慢,以及怎麼解決。。。)
七、

劉傑面試:
二分查找
線程輪換打印奇偶數
線程池的參數都有啥
線程安全的概念
怎麼實現
lock類裏喚醒線程的方法
主要圍繞多線程
我說validate關鍵字順帶說了內存模型
項目遇到的難點

 

先說mq特性,而後問到再說唄
Mq最多問的:問的最多就是mq的時序和事物,冪等


時間同步技術 ntp
主動更新,數據庫字段更新後發消息更新緩存,這個須要用到一個組件阿里叫metaq就是就是數據庫字段更新會產生一條消息
在 URL 中用逗號隔開,服務端會有一個組件解析這個 URL是阿里版Nginx的一個插件
不太明白你問啥意思,是說壓測工具嗎? Apache ab就很好
系統靜態化改造
合併部署
一致性hash算法


算法和數據結構:各類排序,遍歷,查找。時間複雜度,樹,二叉樹,平衡二叉樹,紅黑樹,棧,隊列。鏈表

Java 集合,static,final,集合原理。文件。匿名類,泛型,反射

26種設計模式

網絡:http,https,tcpip 套接字

Spring springmvc 讀源碼

業務,整個廣告的流程,計費,還有高級設置,頻次控制什麼的是怎麼實現的

Maven整個項目的結構

Redis和memcache

Nginx的基本配置

Jvm

性能調優

分佈式

數據庫,數據庫的優化,sql,去重,各類sql

設計模式項目同步模塊配置Spark 和mapreduce 的關係計費Redis 隊列的實現和memcache 的關係Mysql 調優頻次控制得實現什麼的併發301和302重點是能不能把一個不懂這個項目得人講明白各類包Spring 事物Mybaties 是用jdbc 連接數據庫嗎數據庫裏面的範式Java 8新特性自動拆裝箱靜態類和非靜態類得區別Hashmap 的實現。各類集合的區別Spring 事物Spring 單實例的實現單例模式

相關文章
相關標籤/搜索