1. 程式人生 > 實用技巧 >JAVA面試1

JAVA面試1

北京JAVA開發三年,拿到美團35K的offer面試心得

原創Java高階開發之路2020-12-08 21:44:36

前言

長文乾貨提示,文章為大家完整記錄了一位在北京做了3年的JAVA開發的朋友,如何通過美團的面試及拿到35K的offer。全篇內容由全程電話錄音再手打騰稿,原創手打不易,請記得點贊收藏支援哦!
文章末尾有為大家準備好的JAVA面試資料。

面試總結

JAVA基礎

1. JAVA中的幾種基本資料型別是什麼,各自佔用多少位元組,Integer佔幾個位元組.

八種基本資料型別,int(4),short(2),byte(1),long(8),float(4),double(8),char(2),boolean(1)
Integer佔用
32位:Header(標記頭4位元組 + 物件指標4位元組) + int(4位元組)+ 對齊(4) = 16位元組
64位:Header(標記頭8位元組 + 物件指標8位元組) + int(4位元組)+ 對齊(4) = 24位元組
64位(開啟指標壓縮):Header(標記頭8位元組 + 物件指標4位元組) + int(4位元組)+ 對齊(0) = 16位元組

2. String類能被繼承嗎,為什麼.

String是一個被final修飾的類,不能被繼承

3. String,Stringbuffer,StringBuilder的區別.

String是Java中基礎且重要的類,並且String也是Immutable類的典型實現,被宣告為final class,除了hash這個屬性其它屬性都宣告為final,因為它的不可變性,所以例如拼接字串時候會產生很多無用的中間物件,如果頻繁的進行這樣的操作對效能有所影響.
StringBuffer就是為了解決大量拼接字串時產生很多中間物件問題而提供的一個類,提供append和add方法,可以將字串新增到已有序列的末尾或指定位置,它的本質是一個執行緒安全的可修改的字元序列,把所有修改資料的方法都加上了synchronized.但是保證了執行緒安全是需要效能的代價的.在很多情況下我們的字串拼接操作不需要執行緒安全,這時候StringBuilder登場了,StringBuilder是JDK1. 5釋出的,它和StringBuffer本質上沒什麼區別,就是去掉了保證執行緒安全的那部分,減少了開銷.
StringBuffer 和 StringBuilder 二者都繼承了 AbstractStringBuilder ,底層都是利用可修改的char陣列(JDK 9 以後是 byte陣列).

4. ArrayList和LinkedList有什麼區別.

ArrayList底層是陣列實現,具有陣列的特性,增刪慢,查詢快
LinkedList底層是採用連結串列來實現,增刪快,查詢慢

5. 講講類的例項化順序,比如父類靜態資料,建構函式,欄位,子類靜態資料,建構函式,欄位,當new的時候,他們的執行順序.

類的例項化順序:先靜態再父子
父類靜態資料->子類靜態資料->父類欄位->子類欄位->父類建構函式->子類建構函式

6. 用過哪些Map類,都有什麼區別,HashMap是執行緒安全的嗎,併發下使用的Map是什麼,他們內部原理分別是什麼,比如儲存方式,hashcode,擴容,預設容量等.

最常用的Map實現類有:HashMap,ConcurrentHashMap(jdk1. 8),LinkedHashMap,TreeMap,Hashtable;
其中最頻繁的是HashMap和ConcurrentHashMap,他們的主要區別是HashMap是非執行緒安全的.ConcurrentHashMap是執行緒安全的.
併發下可以使用ConcurrentHashMap和Hashtable,他們的主要區別是:
(1). ConcurrentHashMap的hash計算公式:(key. hascode()^ (key. hascode()>>> 16)) & 0x7FFFFFFF
    Hashtable的hash計算公式:key. hascode()& 0x7FFFFFFF
(2). Hashtable儲存方式都是連結串列+陣列,數組裡面放的是當前hash的第一個資料,連結串列裡面放的是hash衝突的資料
    ConcurrentHashMap是陣列+連結串列+紅黑樹
(3). 預設容量都是16,負載因子是0.75.就是當hashmap填充了75%的busket是就會擴容,最小的可能性是(16*0. 75),一般為原記憶體的2倍
(4). 執行緒安全的保證:Hashtable是在每個操作方法上面加了synchronized來達到執行緒安全,ConcurrentHashMap執行緒是使用CAS(compore and swap)來保證執行緒安全的

7. JAVA8的ConcurrentHashMap為什麼放棄了分段鎖,有什麼問題嗎,如果你來設計,你如何設計.

jdk8 放棄了分段鎖而是用了Node鎖,減低鎖的粒度,提高效能,並使用CAS操作來確保Node的一些操作的原子性,取代了鎖.
但是ConcurrentHashMap的一些操作使用了synchronized鎖,而不是ReentrantLock,雖然說jdk8的synchronized的效能進行了優化,
但是我覺得還是使用ReentrantLock鎖能更多的提高效能(優先使用synchronized,虛擬機器一直在優化這個鎖)

8. 有沒有有順序的Map實現類,如果有,他們是怎麼保證有序的.

順序的Map實現類:LinkedHashMap,TreeMap
LinkedHashMap是基於元素進入集合的順序或者被訪問的先後順序排序,TreeMap 則是基於元素的固有順序(預設是hashcode,可以實現Comparable自定義排序規則).

9. 抽象類和介面的區別,類可以繼承多個類麼,介面可以繼承多個介面麼,類可以實現多個介面麼.

抽象類有構造方法,介面沒有;抽象類中可以有方法的實現(8以後介面也可以了,default方法),類只能單繼承,介面可以繼承多個介面,類可以實現多個介面

10. 繼承和組合的區別在哪.

繼承指的是一個類繼承另外的一個類的功能,並可以增加它自己的新功能的能力,繼承是類與類或者介面與介面之間最常見的關係;在Java中此類關係通過關鍵字extends明確標識.
聚合體現的是整體與部分,擁有的關係,此時整體與部分之間是可分離的,他們可以具有各自的生命週期;比如計算機與CPU,公司與員工的關係等;

11. IO模型有哪些,講講你理解的nio ,他和bio,aio的區別是啥,談談reactor模型.

BIO:同步阻塞式IO,伺服器實現模式為一個連線一個執行緒,即客戶端有連線請求時伺服器端就需要啟動一個執行緒進行處理,如果這個連線不做任何事情會造成不必要的執行緒開銷,當然可以通過執行緒池機制改善.
NIO:同步非阻塞式IO,伺服器實現模式為一個請求一個執行緒,即客戶端傳送的連線請求都會註冊到多路複用器上,多路複用器輪詢到連線有I/O請求時才啟動一個執行緒進行處理.
reactor模型:反應器模式(事件驅動模式):當一個主體發生改變時,所有的屬體都得到通知,類似於觀察者模式.

12. 反射的原理,反射建立類例項的三種方式是什麼.

反射的原理:如果知道一個類的名稱/或者它的一個例項物件, 就能把這個類的所有方法和變數的資訊(方法名,變數名,方法,修飾符,型別,方法引數等等所有資訊)找出來.
反射建立類例項的三種方式:
1. Class.forName("com.A");
2. new A().getClass();
3. A.class;

13. 反射中Class.forName和ClassLoader區別

class.forName()除了將類的.class檔案載入到jvm中之外,還會對類進行解釋,執行類中的static塊.
classLoader只幹一件事情,就是將.class檔案載入到jvm中,不會執行static中的內容,只有在newInstance才會去執行static塊.

14. 描述動態代理的幾種實現方式,分別說出相應的優缺點.

動態代理有兩種實現方式,分別是:jdk動態代理和cglib動態代理
jdk動態代理的前提是目標類必須實現一個介面,代理物件跟目標類實現一個介面,從而避過虛擬機器的校驗.
cglib動態代理是繼承並重寫目標類,所以目標類和方法不能被宣告成final.

15. 動態代理與cglib實現的區別.

動態代理有兩種實現方式,分別是:jdk動態代理和cglib動態代理
jdk動態代理的前提是目標類必須實現一個介面,代理物件跟目標類實現一個介面,從而避過虛擬機器的校驗.
cglib動態代理是繼承並重寫目標類,所以目標類和方法不能被宣告成final.

16. 為什麼CGlib方式可以對介面實現代理.

cglib動態代理是繼承並重寫目標類,所以目標類和方法不能被宣告成final.而介面是可以被繼承的.

17. final的用途.

1). final修飾的物件不能被修改;
2). final修飾的類不能被繼承;
3). final修飾的方法不能被重寫;

18. 寫出三種單例模式實現.

懶漢式(先定義,用的時候再建立),餓漢式(定義並建立好,用的時候直接拿),飽漢式(靜態內部類,列舉)

19. 如何在父類中為子類自動完成所有的hashcode和equals實現?這麼做有何優劣.

父類的equals不一定滿足子類的equals需求.比如所有的物件都繼承Object,預設使用的是Object的equals方法,在比較兩個物件的時候,是看他們是否指向同一個地址.
但是我們的需求是物件的某個屬性相同,就相等了,而預設的equals方法滿足不了當前的需求,所以我們要重寫equals方法.
如果重寫了equals 方法就必須重寫hashcode方法,否則就會降低map等集合的索引速度.

20. 請結合OO設計理念,談談訪問修飾符public,private,protected,default在應用設計中的作用.

public 所有的地方都能訪問
protected 外部包不能訪問
default  子類和外部包不能訪問
private 只能在類內部訪問

21. 深拷貝和淺拷貝區別.

淺拷貝只拷貝指標,深拷貝就是拷貝他的值,重新生成的物件.

22. 陣列和連結串列資料結構描述,各自的時間複雜度.

陣列是將元素在記憶體中連續存放,由於每個元素佔用記憶體相同,可以通過下標迅速訪問陣列中任何元素.
連結串列恰好相反,連結串列中的元素在記憶體中不是順序儲存的,而是通過存在元素中的指標聯絡到一起.
訪問陣列中第 n 個數據的時間花費是 O(1) 但是要在陣列中查詢一個指定的資料則是 O(N) .當向陣列中插入或者刪除資料的時候,最好的情況是在陣列的末尾進行操作,時間複雜度是 O(1) ,但是最壞情況是插入或者刪除第一個資料,時間複雜度是 O(N) .在陣列的任意位置插入或者刪除資料的時候,後面的資料全部需要移動,移動的資料還是和資料個數有關所以總體的時間複雜度仍然是 O(N) . 
在連結串列中查詢第 n 個數據以及查詢指定的資料的時間複雜度是 O(N) ,但是插入和刪除資料的時間複雜度是 O(1)

23. error和exception的區別,CheckedException,RuntimeException的區別.

Error(錯誤)表示系統級的錯誤和程式不必處理的異常,是java執行環境中的內部錯誤或者硬體問題.比如:記憶體資源不足等.對於這種錯誤,程式基本無能為力,除了退出執行外別無選擇,它是由Java虛擬機器丟擲的.
Exception(違例)表示需要捕捉或者需要程式進行處理的異常,它處理的是因為程式設計的瑕疵而引起的問題或者在外的輸入等引起的一般性問題,是程式必須處理的.
Exception又分為執行時異常,受檢查異常.
RuntimeException(執行時異常),表示無法讓程式恢復的異常,導致的原因通常是因為執行了錯誤的操作,建議終止程式,因此,編譯器不檢查這些異常.
CheckedException(受檢查異常),是表示程式可以處理的異常,也即表示程式可以修復(由程式自己接受異常並且做出處理), 所以稱之為受檢查異常.

24. 請列出5個執行時異常.

NullPointerException
IndexOutOfBoundsException
ClassCastException
ArrayStoreException
BufferOverflowException

25. 在自己的程式碼中,如果建立一個java.lang.String類,這個類是否可以被類載入器載入?為什麼.

不可以,雙親委派模式會保證父類載入器先載入類,就是BootStrap(啟動類)載入器載入jdk裡面的java.lang.String類,而自定義的java.lang.String類永遠不會被載入到

26. 說一說你對java.lang.Object物件中hashCode和equals方法的理解.在什麼場景下需要重新實現這兩個方法.

父類的equals不一定滿足子類的equals需求.比如所有的物件都繼承Object,預設使用的是Object的equals方法,在比較兩個物件的時候,是看他們是否指向同一個地址.
但是我們的需求是物件的某個屬性相同,就相等了,而預設的equals方法滿足不了當前的需求,所以我們要重寫equals方法.
如果重寫了equals 方法就必須重寫hashcode方法,否則就會降低map等集合的索引速度.

27. 在jdk1.5中,引入了泛型,泛型的存在是用來解決什麼問題.

泛型的好處是在編譯的時候檢查型別安全,並且所有的強制轉換都是自動和隱式的,提高程式碼的重用率.

28. 這樣的a.hashcode()有什麼用,與a.equals(b)有什麼關係.

hashCode()方法是相應物件整型的 hash值.它常用於基於hash的集合類,如Hashtable,HashMap,LinkedHashMap等等.它與 equals() 方法關係特別緊密.根據 Java 規範,兩個使用 equal() 方法來判斷相等的物件,必須具有相同的 hash code.

29. 有沒有可能2個不相等的物件有相同的hashcode.

有可能,最簡單的方法,百分百實現的方式就是重寫hascode();

30. Java中的HashSet內部是如何工作的.

HashSet的內部採用 HashMap來實現.由於Map需要key和value,所以HashSet中所有key的都有一個預設value.類似於 HashMap,HashSet 不允許重複的 key,只允許有一個null key,意思就是 HashSet 中只允許儲存一個null物件.

31. 什麼是序列化,怎麼序列化,為什麼序列化,反序列化會遇到什麼問題,如何解決.

序列化:把物件轉換為位元組序列的過程稱為物件的序列化.
反序列化:把位元組序列恢復為物件的過程稱為物件的反序列化.
詳細:https://blog.csdn.net/riemann_/article/details/87835260

32. java8的新特性.

33. 講講SPI機制

破環雙親委派模型的經典方法(上下文context),jdbc驅動,dubbo,springboot都有,把依賴的第三方的jar包通過外部路徑載入

JVM知識

1. 什麼情況下會發生棧記憶體溢位.

https://blog.csdn.net/qq_31615049/article/details/82980799

2. JVM的記憶體結構,Eden和Survivor比例.

Java堆
方法區
程式計數器
JVM棧
本地方法棧
java7有永久代,8以後是元空間,要說明為什麼這麼改

3. JVM記憶體為什麼要分成新生代,老年代,持久代.新生代中為什麼要分為Eden和Survivor.

4. JVM中一次完整的GC流程是怎樣的,物件如何晉升到老年代,說說你知道的幾種主要的JVM引數.

5. 你知道哪幾種垃圾收集器,各自的優缺點,重點講下cms和G1,包括原理,流程,優缺點.

6. 垃圾回收演算法的實現原理.

7. 當出現了記憶體溢位,你怎麼排錯.

8. JVM記憶體模型的相關知識瞭解多少,比如重排序,記憶體屏障,happen-before,主記憶體,工作記憶體等.

9. 簡單說說你瞭解的類載入器,可以打破雙親委派麼,怎麼打破.

10. 講講JAVA的反射機制.

11. 你們線上應用的JVM引數有哪些.

12. g1和cms區別,吞吐量優先和響應優先的垃圾收集器選擇(最新有個ZGC,可以瞭解下).

13. 怎麼打出執行緒棧資訊.

14. 請解釋如下jvm引數的含義:

-server -Xms512m -Xmx512m -Xss1024K 
-XX:PermSize=256m -XX:MaxPermSize=512m 
-XX:MaxTenuringThreshold=20XX:CMSInitiatingOccupancyFraction=80 
-XX:+UseCMSInitiatingOccupancyOnly.

-Xms設定堆的最小空間大小.
-Xmx設定堆的最大空間大小.
-XX:NewSize設定新生代最小空間大小.
-XX:MaxNewSize設定新生代最大空間大小.
-XX:PermSize設定永久代最小空間大小.
-XX:MaxPermSize設定永久代最大空間大小.
-Xss設定每個執行緒的堆疊大小.

15. 用過那些jdk工具排查問題

jps -lvm檢視程序
jstack pid >> pid.txt 列印堆疊,這個一般檢視執行緒狀態
jstat -gcutil 檢視gc資訊
jmap 排查oom(線上慎用)
阿里的arthas trace watch,可以自己瞭解下

排查oom可以使用eclipse的mat工具分析記憶體

開源框架知識

1. spring的迴圈依賴

三級快取,具體自己看一下

2. spring beanFactory和factoryBean區別

3. spring ioc和aop的原理.

4. 講講spring事務的傳播屬性,transaction註解原理.

5. spring的beanpostprocesser和refresh方法

6. spring和springboot區別,瞭解springboot的pom嗎

7. springboot是怎麼整合tomcat的?

8. zookeeper的原理

zab協議,崩潰恢復和日誌同步

9. 用過的rpc框架,dubbo的原理

10. 瞭解k8s_docker嗎,宿主機怎麼檢視docker程序,k8s自動擴容的原理

作業系統

1. Linux系統下你關注過哪些核心引數,說說你知道的.

2. Linux下IO模型有幾種,各自的區別是什麼.

select poll epoll

3. 終止程序ctrl+c發生了什麼

4. 平時用到哪些Linux命令.

netstat檢視網路
iostat 檢視io
lsof 檢視埠
free 檢視記憶體,瞭解幾個區別
df du 參看磁碟
grep 查詢檔案內容 find查詢檔案
ps檢視程序
less more cat tail檢視檔案
chmod修改許可權

5. 用一行命令檢視檔案的最後五行.

tail -5 file.txt

6. 用一行命令輸出正在執行的java程序.

jps -lvm

7. 介紹下你理解的作業系統中執行緒切換過程.

8. 程序和執行緒的區別.

9. top命令之後有哪些內容,有什麼作用.

檢視當前cpu的負載,記憶體使用率

10. 線上CPU爆高,請問你如何找到問題所在.

   死迴圈或者頻繁fullgc
   top -pH按當前執行緒cpu負載從高到低顯示

11. 一個日誌檔案裡面都是ip資訊,打印出現頻率最高的5個ip倒序輸出

多執行緒

1. 多執行緒的幾種實現方式,什麼是執行緒安全.

2. volatile的原理,作用,能代替鎖麼.

保證可見性和有序性,不保證原子性

3. 畫一個執行緒的生命週期狀態圖.

4. sleep和wait的區別.

5. sleep和sleep(0)的區別.

6. Lock與Synchronized的區別.

7. synchronized的原理是什麼,一般用在什麼地方(比如加在靜態方法和非靜態方法的區別,

靜態方法和非靜態方法同時執行的時候會有影響嗎),解釋以下名詞:重排序,自旋鎖,偏向鎖,輕量級鎖,可重入鎖,公平鎖,非公平鎖,樂觀鎖,悲觀鎖.

8. 用過哪些原子類,他們的原理是什麼.

9. 實現一個生產者消費者模式,不用阻塞佇列

10. JUC下研究過哪些併發工具,講講原理.

11. 用過執行緒池嗎,如果用過,請說明原理,並說說newCache和newFixed有什麼區別,建構函式的各個引數的含義是什麼,比如coreSize,maxsize等.

12. 執行緒池的關閉方式有幾種,各自的區別是什麼.

13. 假如有一個第三方介面,有很多個執行緒去呼叫獲取資料,現在規定每秒鐘最多有10個執行緒同時呼叫它,如何做到.

14. spring的controller是單例還是多例,怎麼保證併發的安全.

15. 用三個執行緒按順序迴圈列印abc三個字母,比如abcabcabc.

16. ThreadLocal用過麼,用途是什麼,原理是什麼,用的時候要注意什麼.
ThreadLocalMap 防止記憶體洩漏

17. 如果讓你實現一個併發安全的連結串列,你會怎麼做.

18. 有哪些無鎖資料結構,他們實現的原理是什麼.

19. 講講java同步機制的wait和notify.

20. CAS機制是什麼,如何解決ABA問題.

21. 多執行緒如果執行緒掛住了怎麼辦.

22. countdowlatch和cyclicbarrier的內部原理和用法,以及相互之間的差別(比如countdownlatch的await方法和是怎麼實現的).

23. 對AbstractQueuedSynchronizer瞭解多少,講講加鎖和解鎖的流程,獨佔鎖和公平所加鎖有什麼不同.

24. 使用synchronized修飾靜態方法和非靜態方法有什麼區別.

25. 簡述ConcurrentLinkedQueue和LinkedBlockingQueue的用處和不同之處.

26. 導致執行緒死鎖的原因?怎麼解除執行緒死鎖.

死鎖的四個必要條件: 請求和保持,不可剝奪,互斥,迴圈等待
保證加鎖順序一致避免迴圈等待

27. 非常多個執行緒(可能是不同機器),相互之間需要等待協調,才能完成某種工作,問怎麼設計這種協調方案.

28. 用過讀寫鎖嗎,原理是什麼,一般在什麼場景下用.

讀鎖共享,寫鎖互斥.讀阻塞寫,寫阻塞讀寫,讀之前互相不阻塞 持有寫鎖的執行緒可以獲取讀鎖,完成鎖降級

29. 開啟多個執行緒,如果保證順序執行,有哪幾種實現方式,或者如何保證多個執行緒都執行完再拿到結果.

30. 延遲佇列的實現方式,delayQueue和時間輪演算法的異同.

TCP與HTTP

1. http1.0, http1.1, http2.0有什麼區別.

http1.0一個請求對應一個執行緒

2. TCP三次握手和四次揮手的流程,為什麼斷開連線要4次,如果握手只有兩次,會出現什麼.

3. TIME_WAIT和CLOSE_WAIT的區別.

4. 說說你知道的幾種HTTP響應碼,比如200, 302, 404.

5. 當你用瀏覽器開啟一個連結(如:http://www.javastack.cn)的時候,計算機做了哪些工作步驟.

6. TCP如何保證可靠性,說說TCP頭的結構.

7. 如何避免瀏覽器快取.

8. 如何理解HTTP協議的無狀態性.

9. 簡述Http請求get和post的區別以及資料包格式.

10. HTTP有哪些method

11. 簡述HTTP請求的報文格式.

12. HTTP的長連線是什麼意思.

13. HTTPS的加密方式是什麼,講講整個加密解密流程.

14. Http和https的三次握手有什麼區別.

15. 什麼是分塊傳送.

16. Session和cookie的區別.

架構設計與分散式

1. 用java自己實現一個LRU.

// 繼承LinkedHashMap, 最好自己寫個不用繼承LinkedHashMap的方法
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int MAX_CACHE_SIZE;

public LRUCache(int cacheSize) {
    // 使用構造方法 public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
    // initialCapacity,loadFactor都不重要
    // accessOrder要設定為true,按訪問排序
    super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
    MAX_CACHE_SIZE = cacheSize;
}

@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
    // 超過閾值時返回true,進行LRU淘汰
    return size() > MAX_CACHE_SIZE;
}

}
2. 分散式叢集下如何做到唯一序列號.

雪花演算法(snowflake)

3. 設計一個秒殺系統,30分鐘沒付款就自動關閉交易.

4. 如何使用redis和zookeeper實現分散式鎖?有什麼區別優缺點,會有什麼問題,分別適用什麼場景.(延伸:如果知道redlock,講講他的演算法實現,爭議在哪裡)

5. 如果有人惡意建立非法連線,怎麼解決.

6. 分散式事務的原理,優缺點,如何使用分散式事務,2pc 3pc 的區別,解決了哪些問題,還有哪些問題沒解決,如何解決,你自己專案裡涉及到分散式事務是怎麼處理的.

7. 什麼是一致性hash.

8. 什麼是restful,講講你理解的restful.
9. 如何設計一個良好的API.

10. 如何設計建立和保持100w的長連線.

11. 解釋什麼是MESI協議(快取一致性).

12. 說說你知道的幾種HASH演算法,簡單的也可以.

13. 什麼是paxos演算法, 什麼是zab協議和raft協議.

14. 一個線上文件系統,文件可以被編輯,如何防止多人同時對同一份文件進行編輯更新.

15. 線上系統突然變得異常緩慢,你如何查詢問題.

16. 說說你平時用到的設計模式.

17. Dubbo的原理,有看過原始碼麼,資料怎麼流轉的,怎麼實現叢集,負載均衡,服務註冊和發現,重試轉發,快速失敗的策略是怎樣的 .

18. 一次RPC請求的流程是什麼.

19. 自己實現過rpc麼,原理可以簡單講講.Rpc要解決什麼問題.

20. 非同步模式的用途和意義.

21. 程式設計中自己都怎麼考慮一些設計原則的,比如開閉原則,以及在工作中的應用.

22. 設計一個社交網站中的“私信”功能,要求高併發,可擴充套件等等. 畫一下架構圖.

23. MVC模式,即常見的MVC框架.

24. 聊下曾經參與設計的伺服器架構並畫圖,談談遇到的問題,怎麼解決的.

25. 應用伺服器怎麼監控效能,各種方式的區別.

26. 如何設計一套高併發支付方案,架構如何設計.

27. 如何實現負載均衡,有哪些演算法可以實現.

28. Zookeeper的用途,選舉的原理是什麼.

29. Zookeeper watch機制原理.

30. mybatis的底層實現原理.

31. 請思考一個方案,實現分散式環境下的countDownLatch.

32. 後臺系統怎麼防止請求重複提交.

介面實現冪等

33. 描述一個服務從釋出到被消費的詳細過程.

34. 講講你理解的服務治理.

35. 如何做到介面的冪等性.

36. 如何做限流策略,令牌桶和漏斗演算法的使用場景.

37. 什麼叫資料一致性,你怎麼理解資料一致性.

38. 分散式服務呼叫方,不依賴服務提供方的話,怎麼處理服務方掛掉後,大量無效資源請求的浪費,如果只是服務提供方吞吐不高的時候該怎麼做,如果服務掛了,那麼一會重啟,該怎麼做到最小的資源浪費,流量半開的實現機制是什麼.

39. dubbo的泛化呼叫怎麼實現的,如果是你,你會怎麼做.

40. 遠端呼叫會有超時現象,如果做到優雅的控制,JDK自帶的超時機制有哪些,怎麼實現的.

資料庫知識

1. mysql索引失效的原則

2. mysql的鎖,行鎖,表鎖,樂觀鎖,悲觀鎖,共享鎖,排他鎖

3. mysql myisam和innodb儲存引擎區別

4. mysql的事務隔離級別,rr和rc

5. mysql的acid,以及分別實現acid的底層原理

6. mysql的log, binlog redolog undolog

7. mysql怎麼解決幻讀的

8. mysql的mvvc原理,在rr和rc的實現區別

9. 聚集索引和非聚集索引的區別

10. b樹和b+樹的區別,為什麼用b+樹不用平衡二叉樹,簡單計算b+樹為什麼只有三四層

11. 最左字首原則, 索引怎麼設計

12. 多主怎麼同步資料, 主從模式資料同步

訊息佇列

1. kafka的架構介紹

2. kafka為什麼吞吐量高,幾個優化

3. kafka怎麼實現exactly one

4. kafka怎麼保證訊息有序

5. kafka的冪等和offset什麼時候提交

6. zk在kafka的作用, kafka有那些log

快取

1. 常見的快取策略有哪些,如何做到快取與DB的資料一致性

2. 如何防止快取擊穿和雪崩

3. Redis的五種資料結構,跳錶實現,hash表的擴容

4. redis叢集方案, 哨兵模式的優缺點

5. redis的分散式鎖, 介紹redisson

6. redis的大key 熱key問題 pipeline原理

7. redis的事件模型,key的刪除策略

搜尋

1. elasticsearch瞭解多少,說說你們公司es的叢集架構,索引資料大小,分片有多少,以及一些調優手段.elasticsearch的倒排索引是什麼.

2. elasticsearch 索引資料多了怎麼辦,如何調優,部署.

3. elasticsearch是如何實現master選舉的.

4. 詳細描述一下Elasticsearch索引文件的過程.

5. 詳細描述一下Elasticsearch搜尋的過程.

6. Elasticsearch在部署時,對Linux的設定有哪些優化方法?

7. lucence內部結構是什麼.

演算法題 (Leetcode top200)

1. 環形連結串列的第一個環節點

2. 只有0和1的陣列排序

 雙指標交換 O(n)時間,O(1)空間

3. 兩個連結串列的第一個相交節點

4. 合併兩個有序連結串列,合併多個有序連結串列

5. 生成全排列

6. 山脈陣列最大值(先增後減有重複)

7. 合併有序陣列a和b,a有足夠空間,不新申請空間合併

8. 有序陣列不同平方的數字

9. 列印樹指定和的路徑

10. 字串刪除k個數的最大數

11. 樹的層次遍歷

12. 1-n號個人 1-n號個燈 開始燈關的如果燈的編號能被人的編碼整除按一下開關,對於1-n的燈都有1-n的人經過最後那些燈亮

13. ip地址轉數字

14. 編輯距離,兩個矩形交叉面積,連結串列倒序k組翻轉,種子填充,三個有序連結串列公共數

場景題

1. 設計一個限流器

漏桶和令牌桶,主要是令牌桶的滑動視窗

2. 伺服器有很多ip只能加四個白名單,怎麼解決?

用代理解決

3. 如果高併發服務快取掛了,db被打掛,怎麼重啟服務,因為快取掛了db重啟還會掛掉

服務降級,限流走訊息佇列,下來想了下可以預熱新快取叢集(快取走持久化策略)然後再重啟db(面試官不滿意,我自己搜總結的,你再瞅瞅)

4. 分庫分表的跨表查詢方案優化

一個是快取查詢資料,另一個方案就是維護冗餘的全量資料表

5. 多伺服器共用一個第三方業務的token,第三方定期更新

我的方案是token放redis快取, 分散式定時任務更新,引入zk,只有leader的機器才會執行獲取最新token(可以提供rpc介面更新觸發回撥,監控半個小時沒有更新報警,我自己想的)

6. 線上業務執行緒池的引數設定

基於響應時間和吞吐量,最後做成動態配置引數
https://blog.csdn.net/ailiandeziwei/article/details/105477933

7. 四核機器怎麼保證cpu佔用率50%

啟動兩個執行緒的死迴圈任務

8. 設計檔案系統,支援增加刪除,修改檔案(夾),按時間到序列查詢資料夾下面所有檔案(夾),給表設計

file表
id long primary key
type tinyint
name varchar
deleted tinyint
createTime long
updateTime long

file relation表
id long primary key
parentId long
childId long
createTime long
key (parentId, createdTime)

9. 國慶節滴滴掛了,什麼問題,怎麼解決

這個我不瞭解,沒回答好

專案梳理

講專案的技術難點,除了業務我總結出了我專案的兩個難點

1. 樂觀鎖解決冪等併發更新(updateTime,行業方案是version)

2. 維護兩套redis快取做高可用

3. 談專案架構,多級快取設計,分庫分表,一些功能的表設計,對具體業務的細節理解

總結

Java架構師成長之路可以說每一步都充滿了荊棘,大佬的學習資料與筆記能夠幫助你指點方向,最重要的還是要靠大家堅持不懈的努力,最後也祝大家都實現Java架構師的夢想!