【2020】超100篇牛客網Java面經高頻知識點彙總

總覺得自己好像什麼都會點,但是面試就被問得很懵逼,自己很菜就不再吐槽了

最近瘋狂的在牛客刷面經,但是過目就忘了!!!所以分門別類的記錄了一下高頻的考點。
何爲高頻的考點?快速掃描了七八十篇面經後,再看的面經絕大部分都在我筆記覆蓋了!
所以看完了100多篇就沒怎麼看了,還是整理整理開始狂補基礎知識吧!

本文內容來自陌陌、美團、阿里、鏈家、快手、京東、瓜子、滴滴、百度、愛奇藝、vivo等十多個公司最近三年的100多篇面經中比較高頻的總結,有的是校招的有的是實習的,不過不影響學習。學習嘛,反正都得學。


一、JVM

  1. JVM內存結構

    • JVM的分區(Java的內存管理機制)(JAVA 的運行時區域分配):都說的是JVM的內存結構

    • JVM哪個區域不會發生內存溢出

  2. 類加載器

    • JVM 類加載機制

    • class 文件如何執行

    • 爲什麼要引入雙親委派機制

    • 什麼情況下用自定義類加載器

  3. 反射

    • 寫一段反射的代碼

  4. GC

    • 哪些階段會發生STW現象

    • G1垃圾回收爲什麼可停頓

    • GC的工作流程

    • FULL GC發生場景

    • 如何打印GC日誌

    • 經常FULL GC怎麼定位到錯誤

    • GC可達性分析怎麼做,哪些可以作爲GC Root

    • CMS收集器和G1垃圾回收器回收垃圾過程

    • G1的優點

    • 垃圾回收的過程,什麼對象會進入老年代

    • 垃圾回收算法有哪些?爲什麼新生代使用複製算法

    • 高吞吐量時用哪種GC算法、

    • 執行了System.gc()觸發GC機制後如何進行回收的

  5. 其他

    • JVM排錯方式

    • 內存泄露的原因,舉例說明

    • 如何排查內存泄露

    • JVM啓動參數有哪些,列舉熟悉的幾個

    • JVM爲什麼分新生代和老年代

    • 系統週期性卡頓,如何定位問題,結合GC日誌

    • 在 JVM上運行一段Java 程序輸出一條語句,它是怎麼輸出到屏幕上的

二、 併發

    • Java 中的鎖機制

    • 爲什麼需要鎖

    • 介紹下幾種鎖

      • 公平鎖和非公平鎖的區別

      • 悲觀鎖和樂觀鎖

      • 可重入鎖與非可重入鎖

      • 自旋鎖與阻塞鎖

    • Synchronized

      • Synchronized和ReetrantLock的區別

      • Synchronized的偏向鎖、輕量級鎖、重量級鎖

      • Synchronized關鍵字的底層原理

    • Reentrantlock

      • Reentrantlock 有哪些方法

      • 有Synchronized了爲什麼還需要Reentrantlock

      • tryLock()在什麼場景下用

    • 讀鎖插隊策略,鎖升降級策略

    • 如何優化鎖並提高併發性能

  1. 線程池

    • 線程池是如何實現的

    • 使用線程池帶來的好處

    • 常見的線程池有哪些,各個參數的意義

    • 執行線程池的兩種方式

    • 線程池怎麼定時完成一項任務?

    • 線程池線程都有任務,阻塞隊列也滿了,再來任務怎麼辦?

    • Java 線程池 ThreadPoolExecuter 和四個自帶的線程池分別適合什麼場景?

    • ScheduledThreadPoolExecutor 中的使用的是什麼隊列?內部如何實現任務排序

    • 線程池常見的拒絕策略

    • 如何優雅的關閉線程池

    • 如何設計一個簡單的線程池

  2. 併發類

    • 怎麼實現一個類滿足插入和刪除操作的原子性

    • JUC原子類的實現原理

    • AQS的原理和應用場景

    • CAS的底層原理和應用場景,ABA問題

    • 怎麼實現一個線程安全的計數器? 原子類 AtomicInteger 實現原理是什麼?和你設計的計數器優劣比較? CAS 怎麼實現原子操作的?

    • ThreadLocal 

      • ThreadLocal 的應用場景

      • ThreadLocal 與Thread的關係

      • ThreadLocal 使用不當爲什麼會發生內存溢出?怎麼避免

    • CopyOnWriteList 

      • CopyOnWriteArrayList 與ArrayList相比有哪些異同?

      • CopyOnWriteArrayList 通過哪些手段實現了線程安全?

      • 爲什麼 CopyOnWriteArrayList 迭代過程中,數組結構變動,不會拋出ConcurrentModificationException ?

      • CopyOnWriteArrayList對批量數據進行寫操作時需要怎麼優化

    • ConcurrentHashMap

      • ConcurrentHashMap 和 HashMap 的相同點和不同點

      • ConcurrentHashMap 通過哪些手段保證線程安全

      •  CAS 算法在 ConcurrentHashMap 中的應用

      • ConcurrentHashMap 是如何發現當前槽點正在擴容的?

      • 發現槽點正在擴容時,put 操作會怎麼辦?

      • ConcurrentHashMap 和HashMap的擴容有什麼不同?

      • ConcurrentHashMap 在 Java 7 和 8 中關於線程安全的做法有啥不同?

      • 爲什麼超過沖突超過8纔將鏈表轉爲紅黑樹而不直接用紅黑樹

    • 阻塞隊列

      • 哪些隊列具有阻塞的功能,大概是如何阻塞的?

      • LinkedBlockingQueue 和 ArrayBlockingQueue 的區別?

      • 往隊列裏 put 數據和take數據是線程安全的麼?爲什麼?

      • take和put方法是不是同一時間只能運行其中一個

      • SynchronousQueue 底層有幾種數據結構,兩者有何不同?

      • 如果想使用固定大小的隊列,有幾種隊列可以選擇,有何不同?

      • ArrayBlockingQueue 的take 和 put 都是怎麼找到索引位置的?是利用 hash 算法計算得到的麼?

  3. 線程

    • 進程和線程的區別

    • Java進程與線程的關係

    • 進程之間常見的通信方式

    • 有多少種實現線程的方法?

    • Java 怎麼實現線程安全的

    • Java 中線程如何交互

    • 實現Runnable接口和繼承Thread類哪種方式更好?

    • 一個線程兩次調用start()方法會出現什麼情況?爲什麼?

    • 既然start()方法會調用run方法,爲什麼我們選擇調用start方法而不是直接調用run方法呢?

    • 多線程中斷的原理

    • 如何正確停止線程

    • 線程有哪幾種狀態?生命週期是什麼?

    • 什麼是生產者消費者模式

    • 爲什麼wait方法需要在同步代碼塊內使用,而sleep不需要

    • wait方法是屬於Object對象的,那調用Thread.wait()會怎麼樣

    • 爲什麼線程通信的方法wait、notify、notifyAll被定義在Object類中?而slepp方法被定義在Thread類中?

    • wait/notify、sleep異同

    • yield和sleep的區別

    • 在join期間,線程處於哪種線程狀態?

    • notifyAll之後所有的線程都會再次搶奪鎖,如果某線程搶奪失敗怎麼辦?

    • 守護線程和普通線程的區別?我們是否需要給線程設置守護線程?

    • 什麼是多線程的上下文切換

    • 爲什麼多線程會帶來性能問題?

    • 單例模式的作用和適用場景

    • 分佈式集羣中如何保證線程安全?

  4. volatile

    • volatile有什麼作用,什麼時候發生指令重排

    • 什麼時候適合用vilatile

    • volatile 關鍵字的底層實現, volatile 是不是原子性的

  5. Java內存模型

    • Java內存模型和JVM內存結構有什麼不同

    • 什麼是Java內存模型,爲什麼會出現Java內存模型

    • i++是線程安全的麼,從 Java 內存模型來分析,如何保證它是安全的

    • 什麼是原子性問題,Java中有哪些原子操作

    • new一個對象的過程是否是原子的

    • 什麼是可見性問題,爲什麼會出現,又如何解決

    • 什麼是重排序(有序性問題),重排序有什麼意義

    • 列舉幾條happens-before規則

三、 Java基礎

 

  1. 數據類型

    • String

      • 爲什麼String類型要用final修飾?

      • equals和‘==’的區別是什麼?

      • String幾種拼接方式區別,+和 append 底層有沒有區別

      • String 爲什麼是不可變的

      • String 和 StringBuilder、StringBuffer 有什麼區別?

      • String 的intern()方法有什麼含義?(1.6和1.7)

      • String 是值傳遞還是引用傳遞

      • String類型在JVM中如何存儲的(字符串常量池相關 比較1.6和1.7)

    • float和double的精度,底層存儲方式,和decimal有什麼區別

    • Integer 與 int 區別(包含自動拆裝箱)

    • 8個基本數據類型和對應的包裝類

    • Atomic Integer 和 Integer 區別。 Atomic Integer 原理

    • char 類型能否存儲一箇中文字符?

  2. 設計模式

    • 單例模式

      • 手寫你認爲最好的單例模式(枚舉生產環境最佳,面試雙重檢查最優逼格,靜態內部類也比較優)

      • 餓漢式和懶漢式的區別和各自的優缺點

    • 解釋幾個常用的設計模型,從項目出發

  3. Java基本概念

    • 重寫和重載區別

    • JDK、JRE和JVM的區別和聯繫

    • Java中小數是怎麼存的

    • static 方法和實例方法的區別

    • Java 中的 error 和 exception的區別,Java 異常體系

    • 抽象類和接口的區別

    • Java 接口能定義方法體嗎(1.7和1.8比較)

    • 抽象類中可以有實現方法嗎,它和普通方法的區別

    • 不可變類和不可變對象

    • final的三種用法

    • 什麼時候用抽象類,什麼時候用接口

    • Java Object 類中常用方法

    • ==和 equals 和 hashcode()的區別

    • enum 構造方法是公共還是私有的?

    • 強引用、軟引用、弱引用、幻象引用有什麼區別?

  4. 集合類

    • HashMap

      • HashMap的底層實現結構(1.7和1.8)

      • hash()和 equals()方法的區別

      • HashMap 如何獲取 key?

      • HashMap 的初始容量,加載因子,擴容增量

      • HashMap 擴容爲什麼是 2 倍不是 3 倍(HashMap的長度爲什麼是2的整數冪值)

      • 加載因子爲什麼默認0.75

      • HashMap的存儲和獲取流程(1.7和1.8)

      • HashMap擴容的步驟(1.7和1.8)

      • 解決Hash衝突的方法Hashtable、HashMap、TreeMap 有什麼不同?

      • 舉例說明HashMap是線程不安全的

      • ConcurrentHashMap和Hashtable的區別?

      • 爲什麼JDK1.8會HashMap會把鏈表轉爲紅黑樹

    • ArrayList

      • Vector、ArrayList和LinkedList有哪些區別?

      • ArrayList 是怎麼擴容的?初始化時給定 ArrayList 的 size,數組大小一定就是給定值嗎

      • ArrayList 和 LinkedList 的區別?插入、刪除、訪問的時間複雜度?

      • Arraylist 和 Linkedlist 在尾部插入一個節點,哪個更快

    • HashSet和TreeSet有哪些區別?

    • Collection和Collections有什麼關係?

    • LinkedHashMap和TreeMap的區別(兩個有序)

  5. maven 遇到版本不匹配的問題怎麼解決

  6. 序列化和反序列化怎麼實現,自己設計會怎麼做

  7. 對 Java7、 8 的新特性有什麼瞭解

  8. BIO、NIO、AIO 的區別和聯繫

  9. main 方法聲明成 private 可以通過編譯嘛?

  10. 對稱加密和非對稱加密

  11. REASTful API 的規範,REASTful是實現機制,keepalive作用

  12. lombok 底層實現怎麼實現註解?

  13. 對象頭中有哪些信息

  14. 什麼是 rpc 框架?和 http 調用的區別是什麼?

  15. kafka如何保證數據可靠性

 

四、 數據庫

  1. MYSQL

    • MYSQL索引在什麼情況下會失效

    • MYSQL的分區

    • MYSQL的存儲引擎:底層實現、對比、適用場景

    • B 樹, B+樹在數據庫存儲中的作用、區別

    • MYSQL的組合索引(最左前綴匹配原則) , 建立了 A,B,C 三 個 列 的 組 合 索 引 A=1andB=1,A=1andC=1,A=1andB>1andC=1,A=1 order by B,這幾種情況,哪種情況組合索引生效、

    • MYSQL的分庫分表,分庫分表後如何保證分佈式id

    • MYSQL什麼時候發生死鎖

    • MYSQL的 innodb 引擎爲什麼不用 B 樹

    • MYSQL的主從複製原理,如何實現

    • 如果是存儲日誌,用什麼存儲引擎比較合適

    • MYSQL的鎖有哪幾種,行鎖的實現原理

    • 一條SQL在MYSQL中的執行過程

    • MYSQL查詢緩存在什麼時候觸發?什麼時候失效

  2. Redis

    • Redis有哪些數據結構

    • Redis的應用場景,過期策略

    • Redis 集羣設計方案

    • Redis的持久化機制,應用場景

    • Redis爲什麼那麼快

    • 爲什麼使用 redis 做消息隊列

    • Redis緩存穿透,緩存雪崩,以及如何解決

    • Redis有序集合的底層數據結構,爲什麼用跳錶 壓縮列表比純用跳錶好

    • AOF重寫實現原理

    • Redis分佈式鎖的加鎖解鎖詳細實現

    • 分佈式鎖和鎖區別,什麼時候用,怎麼考慮的

    • Redis 的內存淘汰策略 LRU

  3. 數據庫

    • ACID特性

    • SQL優化

    • 聚簇索引和非聚簇索引

    • 數據庫範式

    • 索引失效的情況?對於非聚集索引查詢的過程?

    • 索引的幾種類型

    • 索引的底層實現

    • 索引的缺點

    • 對於 Gender 這種 2 個屬性的需要建索引嗎?對於 varchar 怎麼建索引?

    • “like”查詢在什麼時候能夠用上索引

    • 數據庫事務的隔離級別分別是什麼,有什麼作用

    • 設計一個數據表實現樹的結構

    • 事務隔離級別有什麼?通過什麼來實現的?分別解決了什麼問題?

    • SQL 慢查詢的常見優化步驟是什麼

    • varchar 和 char 的區別

    • 說下樂觀鎖,悲觀鎖(select for update),並寫出 SQL實現

    • 數據庫中存儲密碼是怎麼存的,還知道其他加密方式嗎

    • 索引(A,B,C),如果 where 條件裏只用 B,索引使用情況。如果 where 條件裏只用(B,C)呢?

    • 怎麼保證緩存和數據庫雙寫一致(MySQL 和 Redis緩存數據不一致)

    • A 和 B 兩個用戶同時插入兩條相同的數據,如何保證表裏面只有一條

 

五、網絡

 

  1. 三次握手四次揮手

    • 三次握手的原因、每次握手的數據包

    • 四次揮手的原因,每次揮手的數據包

    • 兩次握手行不行啊

    • 首次握手的隱患-SYN超時

    • 三次握手要是服務端的服務沒開TCP協議棧怎麼處理

    • 關閉連接時TIME_WAIT的作用

    • 揮手時最後一次ACK如果客戶端沒收到怎麼辦

  2. HTTP

    • HTTP1.0和1.1的區別

    • HTTP請求的方法有哪些

    • Get和Post請求的區別

    • HTTP常用狀態碼

    • 對 HTTPS有什麼瞭解

    • HTTP和HTTPS的區別

  3. TCP/UDP

    • TCP和UDP的區別

    • TCP和UDP包的區別

    • UDP如何實現可靠傳輸

    • TCP和HTTP的區別

    • TCP協議-如何保證傳輸可靠性

  4. 綜合應用

    • 一個網站請求從客戶端到服務器端的過程

    • 一個網頁從輸入 URL 到服務器接收到請求所經歷的過程?

  5. 五層網絡協議和 OSI七層網絡協議

    • 各層的主要功能是什麼

    • TCP 協議在哪一層? IP 協議在那一層? HTTP 在哪一層?

  6. DNS 尋址過程

  7. ARP原理

  8. 長連接和短連接

 

六、 框架

  1. Spring

    • Spring框架的啓動流程

    • IOC和AOP的實現原理

    • 寫一個簡易的IOC和AOP

    • Spring的優點有哪些

    • Spring Bean都是單例的嗎

    • Spring Bean的生命週期

    • Spring Bean的作用域

    • Spring Bean 什麼時候用原型模式

    • Spring如何解決循環依賴,解決哪一種循環依賴

    • cglib 和 jdk 的動態代理的實現原理?這兩者之間性能的區別?

    • 動態代理用多了之後對內存方面有什麼影響嘛?

    • Spring的事務隔離級別

    • Spring的事務的傳播行爲

  2. SpringMVC

    • SpringMVC 工作流程

    • SpringMVC請求URL的步驟,如果請求圖片有什麼不同

    • SpringMVC的Controller是線程安全的嗎

    • @Autowired 的實現原理

    • @Controller,@Service,@Repository,@Componen註解的區別

    • @Resource、@Qualifier和@Autowired區別註解的區別

    • SpringMVC的 dispatcherservlet 的分派原理

  3. Spring Boot的優點,Spring、 SpringMVC、 SpringBoot 的區別

  4. Web基礎

    • servlet的生命週期

    • 過濾器的生命週期

    • Jsp九大內置對象

    • Jsp的四個域對象

    • Session和Cookie的區別

    • MVC設計思想

  5. MyBatis

    • MyBatis與Hibernate的區別

    • MyBatis的核心組件有哪些?

    • DAO接口中的方法可以重載嗎(重點)

    • MyBatis的動態SQL

    • MyBatis的一二級緩存

    • MyBatis的# $區別的區別

    • MyBatis的接口綁定以及實現方式

 

 

 

七、 場景題(這個純屬不會,全部面向Google學習下)

  1. 字符串數目從0開始,一直往後遞增,字符串大小不需要考慮,只是字符串的數量不斷增加,在高併發的情況下,QPS十幾萬時,怎麼生成這個確定的唯一id,還可以保證下次查詢時高效率的查到

  2. 對於一個 10 億的數據,如何統計裏面重複數前 10 多的單詞?

  3. 場景設計,商品表,一共 100 件商品,如何保障多用戶購買商品時,商品數量不會出現負數,並且保證效率最高

  4. 利用 0 到 9, a 到 z 大小寫都算上,生成一個 6 位的隨機密碼,怎麼實現?

  5. 如果一個外賣配送單子要發佈,現在有 200 個騎手都想要接這一單,如何保證 只有一個騎手接到單子?

  6. 假設從 2G 訪問 meituan. com 變成了 4G 訪問 meituan.com,OSI 七層模型,哪一層變了,爲什麼

  7. 一個保存字符串的超大文件,如何判斷一個字符串在不在這個文件

  8. 如果說有一個操作需要創建一個對象,這個對象很大,需要消耗很多資源,如果說每調用一次方法就創建一個對象的話,開銷太大,如果把它定義成一個靜態變量,又會產生並 發問題,那麼多線程併發操作的時候就需要加鎖,降低效率。怎麼優化才能既不用加鎖又能提高併發訪問的效率?

  9. 如果現在有 8G 內存,一個程序很大,由於還要留下一部分內存供其他程序使用,那麼如何控制這個程序使其佔用的內存不能超過 6G 呢?

  10. 對於一個容器,比如 set,你想實現自定義排序規則的話怎麼做

  11. 數據庫中一行記錄大小 10K,一個表只有主鍵索引,可以存多少條數據

  12. 你有沒有試過數據庫一個表中最多可以插入多少數據

  13. 一個 6 位的密碼,使用 MD5 加密,破解需要多久:說的是這樣的,因爲 6 位的密碼排列組合有一定的種數,然後每一種通過 hash 函數去破解,需要多久

  14. 我有 8 件事要做,最要要同意返回處理結果,每件事要進行異步的方式去做。你怎麼完成這個需求

  15. 我需要在項目啓動時,將一些配置加載到內存中,你有什麼方式能解決

  16. 10g 文件,只有 2g 內存,怎麼查找文件中指定的字符串出現位置

  17. 100w 個數,怎麼找到前 1000 個最大的,堆排序?怎麼構造,怎麼調整,時間複雜度

  18. 十億個數的集合和 10w 個數的集合,如何求它們的交集

  19. 給定一個文本 有 5000 萬行數據,給 20 個線程,怎麼利用這 20 個線程,將這些數據同步到數據庫中?(生產者與消費者模型)

  20. 50 個紅球,50 個籃球,有兩個箱子,怎麼將這 100 個球放入箱子,讓另一個人隨機選取箱子並選取其中一個球,是紅球的概率最大

  21. 字符串有 20G 內存存不下,怎麼辦?

  22. 字符串有 1PB,硬盤都裝不下,怎麼辦?

  23. 一個 3 升的桶和一個 5 升的桶,怎麼得到 4 升的水

  24. 1 億個手機號碼,判斷重複

  25. 10G 的文件裏面的數字排序?

  26. 16 瓶正常水, 1 瓶毒水,小白鼠喝下毒水後一小時死亡,只給一小時時間,最少用多少隻小白鼠可以檢測出 14 瓶正常水

  27. 兩根質地不均勻但是燃燒時間與繩子長度無關的一樣的繩子,燃燒完一根繩子耗時一個小時,只能用這兩根繩子,如何準確燒出 15 分鐘?

 

 

 


內容暫時就這麼多,許多內容我博客還是有,就是寫博客還記得寫完了漸進式遺忘

等我吃透了會再總結下這些問題的答案思路再發出來

 


有用就點個贊吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章