總覺得自己好像什麼都會點,但是面試就被問得很懵逼,自己很菜就不再吐槽了
最近瘋狂的在牛客刷面經,但是過目就忘了!!!所以分門別類的記錄了一下高頻的考點。
何爲高頻的考點?快速掃描了七八十篇面經後,再看的面經絕大部分都在我筆記覆蓋了!
所以看完了100多篇就沒怎麼看了,還是整理整理開始狂補基礎知識吧!
本文內容來自陌陌、美團、阿里、鏈家、快手、京東、瓜子、滴滴、百度、愛奇藝、vivo等十多個公司最近三年的100多篇面經中比較高頻的總結,有的是校招的有的是實習的,不過不影響學習。學習嘛,反正都得學。
一、JVM
-
JVM內存結構
-
JVM的分區(Java的內存管理機制)(JAVA 的運行時區域分配):都說的是JVM的內存結構
-
JVM哪個區域不會發生內存溢出
-
-
類加載器
-
JVM 類加載機制
-
class 文件如何執行
-
爲什麼要引入雙親委派機制
-
什麼情況下用自定義類加載器
-
-
反射
-
寫一段反射的代碼
-
-
GC
-
哪些階段會發生STW現象
-
G1垃圾回收爲什麼可停頓
-
GC的工作流程
-
FULL GC發生場景
-
如何打印GC日誌
-
經常FULL GC怎麼定位到錯誤
-
GC可達性分析怎麼做,哪些可以作爲GC Root
-
CMS收集器和G1垃圾回收器回收垃圾過程
-
G1的優點
-
垃圾回收的過程,什麼對象會進入老年代
-
垃圾回收算法有哪些?爲什麼新生代使用複製算法
-
高吞吐量時用哪種GC算法、
-
執行了System.gc()觸發GC機制後如何進行回收的
-
-
其他
-
JVM排錯方式
-
內存泄露的原因,舉例說明
-
如何排查內存泄露
-
JVM啓動參數有哪些,列舉熟悉的幾個
-
JVM爲什麼分新生代和老年代
-
系統週期性卡頓,如何定位問題,結合GC日誌
-
在 JVM上運行一段Java 程序輸出一條語句,它是怎麼輸出到屏幕上的
-
二、 併發
-
鎖
-
Java 中的鎖機制
-
爲什麼需要鎖
-
介紹下幾種鎖
-
公平鎖和非公平鎖的區別
-
悲觀鎖和樂觀鎖
-
可重入鎖與非可重入鎖
-
自旋鎖與阻塞鎖
-
-
Synchronized
-
Synchronized和ReetrantLock的區別
-
Synchronized的偏向鎖、輕量級鎖、重量級鎖
-
Synchronized關鍵字的底層原理
-
-
Reentrantlock
-
Reentrantlock 有哪些方法
-
有Synchronized了爲什麼還需要Reentrantlock
-
tryLock()在什麼場景下用
-
-
讀鎖插隊策略,鎖升降級策略
-
如何優化鎖並提高併發性能
-
-
線程池
-
線程池是如何實現的
-
使用線程池帶來的好處
-
常見的線程池有哪些,各個參數的意義
-
執行線程池的兩種方式
-
線程池怎麼定時完成一項任務?
-
線程池線程都有任務,阻塞隊列也滿了,再來任務怎麼辦?
-
Java 線程池 ThreadPoolExecuter 和四個自帶的線程池分別適合什麼場景?
-
ScheduledThreadPoolExecutor 中的使用的是什麼隊列?內部如何實現任務排序
-
線程池常見的拒絕策略
-
如何優雅的關閉線程池
-
如何設計一個簡單的線程池
-
-
併發類
-
怎麼實現一個類滿足插入和刪除操作的原子性
-
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 算法計算得到的麼?
-
-
-
線程
-
進程和線程的區別
-
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之後所有的線程都會再次搶奪鎖,如果某線程搶奪失敗怎麼辦?
-
守護線程和普通線程的區別?我們是否需要給線程設置守護線程?
-
什麼是多線程的上下文切換
-
爲什麼多線程會帶來性能問題?
-
單例模式的作用和適用場景
-
分佈式集羣中如何保證線程安全?
-
-
volatile
-
volatile有什麼作用,什麼時候發生指令重排
-
什麼時候適合用vilatile
-
volatile 關鍵字的底層實現, volatile 是不是原子性的
-
-
Java內存模型
-
Java內存模型和JVM內存結構有什麼不同
-
什麼是Java內存模型,爲什麼會出現Java內存模型
-
i++是線程安全的麼,從 Java 內存模型來分析,如何保證它是安全的
-
什麼是原子性問題,Java中有哪些原子操作
-
new一個對象的過程是否是原子的
-
什麼是可見性問題,爲什麼會出現,又如何解決
-
什麼是重排序(有序性問題),重排序有什麼意義
-
列舉幾條happens-before規則
-
三、 Java基礎
-
數據類型
-
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 類型能否存儲一箇中文字符?
-
-
設計模式
-
單例模式
-
手寫你認爲最好的單例模式(枚舉生產環境最佳,面試雙重檢查最優逼格,靜態內部類也比較優)
-
餓漢式和懶漢式的區別和各自的優缺點
-
-
解釋幾個常用的設計模型,從項目出發
-
-
Java基本概念
-
重寫和重載區別
-
JDK、JRE和JVM的區別和聯繫
-
Java中小數是怎麼存的
-
static 方法和實例方法的區別
-
Java 中的 error 和 exception的區別,Java 異常體系
-
抽象類和接口的區別
-
Java 接口能定義方法體嗎(1.7和1.8比較)
-
抽象類中可以有實現方法嗎,它和普通方法的區別
-
不可變類和不可變對象
-
final的三種用法
-
什麼時候用抽象類,什麼時候用接口
-
Java Object 類中常用方法
-
==和 equals 和 hashcode()的區別
-
enum 構造方法是公共還是私有的?
-
強引用、軟引用、弱引用、幻象引用有什麼區別?
-
-
集合類
-
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的區別(兩個有序)
-
-
maven 遇到版本不匹配的問題怎麼解決
-
序列化和反序列化怎麼實現,自己設計會怎麼做
-
對 Java7、 8 的新特性有什麼瞭解
-
BIO、NIO、AIO 的區別和聯繫
-
main 方法聲明成 private 可以通過編譯嘛?
-
對稱加密和非對稱加密
-
REASTful API 的規範,REASTful是實現機制,keepalive作用
-
lombok 底層實現怎麼實現註解?
-
對象頭中有哪些信息
-
什麼是 rpc 框架?和 http 調用的區別是什麼?
-
kafka如何保證數據可靠性
四、 數據庫
-
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查詢緩存在什麼時候觸發?什麼時候失效
-
-
Redis
-
Redis有哪些數據結構
-
Redis的應用場景,過期策略
-
Redis 集羣設計方案
-
Redis的持久化機制,應用場景
-
Redis爲什麼那麼快
-
爲什麼使用 redis 做消息隊列
-
Redis緩存穿透,緩存雪崩,以及如何解決
-
Redis有序集合的底層數據結構,爲什麼用跳錶 壓縮列表比純用跳錶好
-
AOF重寫實現原理
-
Redis分佈式鎖的加鎖解鎖詳細實現
-
分佈式鎖和鎖區別,什麼時候用,怎麼考慮的
-
Redis 的內存淘汰策略 LRU
-
-
數據庫
-
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 兩個用戶同時插入兩條相同的數據,如何保證表裏面只有一條
-
五、網絡
-
三次握手四次揮手
-
三次握手的原因、每次握手的數據包
-
四次揮手的原因,每次揮手的數據包
-
兩次握手行不行啊
-
首次握手的隱患-SYN超時
-
三次握手要是服務端的服務沒開TCP協議棧怎麼處理
-
關閉連接時TIME_WAIT的作用
-
揮手時最後一次ACK如果客戶端沒收到怎麼辦
-
-
HTTP
-
HTTP1.0和1.1的區別
-
HTTP請求的方法有哪些
-
Get和Post請求的區別
-
HTTP常用狀態碼
-
對 HTTPS有什麼瞭解
-
HTTP和HTTPS的區別
-
-
TCP/UDP
-
TCP和UDP的區別
-
TCP和UDP包的區別
-
UDP如何實現可靠傳輸
-
TCP和HTTP的區別
-
TCP協議-如何保證傳輸可靠性
-
-
綜合應用
-
一個網站請求從客戶端到服務器端的過程
-
一個網頁從輸入 URL 到服務器接收到請求所經歷的過程?
-
-
五層網絡協議和 OSI七層網絡協議
-
各層的主要功能是什麼
-
TCP 協議在哪一層? IP 協議在那一層? HTTP 在哪一層?
-
-
DNS 尋址過程
-
ARP原理
-
長連接和短連接
六、 框架
-
Spring
-
Spring框架的啓動流程
-
IOC和AOP的實現原理
-
寫一個簡易的IOC和AOP
-
Spring的優點有哪些
-
Spring Bean都是單例的嗎
-
Spring Bean的生命週期
-
Spring Bean的作用域
-
Spring Bean 什麼時候用原型模式
-
Spring如何解決循環依賴,解決哪一種循環依賴
-
cglib 和 jdk 的動態代理的實現原理?這兩者之間性能的區別?
-
動態代理用多了之後對內存方面有什麼影響嘛?
-
Spring的事務隔離級別
-
Spring的事務的傳播行爲
-
-
SpringMVC
-
SpringMVC 工作流程
-
SpringMVC請求URL的步驟,如果請求圖片有什麼不同
-
SpringMVC的Controller是線程安全的嗎
-
@Autowired 的實現原理
-
@Controller,@Service,@Repository,@Componen註解的區別
-
@Resource、@Qualifier和@Autowired區別註解的區別
-
SpringMVC的 dispatcherservlet 的分派原理
-
-
Spring Boot的優點,Spring、 SpringMVC、 SpringBoot 的區別
-
Web基礎
-
servlet的生命週期
-
過濾器的生命週期
-
Jsp九大內置對象
-
Jsp的四個域對象
-
Session和Cookie的區別
-
MVC設計思想
-
-
MyBatis
-
MyBatis與Hibernate的區別
-
MyBatis的核心組件有哪些?
-
DAO接口中的方法可以重載嗎(重點)
-
MyBatis的動態SQL
-
MyBatis的一二級緩存
-
MyBatis的# $區別的區別
-
MyBatis的接口綁定以及實現方式
-
七、 場景題(這個純屬不會,全部面向Google學習下)
-
字符串數目從0開始,一直往後遞增,字符串大小不需要考慮,只是字符串的數量不斷增加,在高併發的情況下,QPS十幾萬時,怎麼生成這個確定的唯一id,還可以保證下次查詢時高效率的查到
-
對於一個 10 億的數據,如何統計裏面重複數前 10 多的單詞?
-
場景設計,商品表,一共 100 件商品,如何保障多用戶購買商品時,商品數量不會出現負數,並且保證效率最高
-
利用 0 到 9, a 到 z 大小寫都算上,生成一個 6 位的隨機密碼,怎麼實現?
-
如果一個外賣配送單子要發佈,現在有 200 個騎手都想要接這一單,如何保證 只有一個騎手接到單子?
-
假設從 2G 訪問 meituan. com 變成了 4G 訪問 meituan.com,OSI 七層模型,哪一層變了,爲什麼
-
一個保存字符串的超大文件,如何判斷一個字符串在不在這個文件
-
如果說有一個操作需要創建一個對象,這個對象很大,需要消耗很多資源,如果說每調用一次方法就創建一個對象的話,開銷太大,如果把它定義成一個靜態變量,又會產生並 發問題,那麼多線程併發操作的時候就需要加鎖,降低效率。怎麼優化才能既不用加鎖又能提高併發訪問的效率?
-
如果現在有 8G 內存,一個程序很大,由於還要留下一部分內存供其他程序使用,那麼如何控制這個程序使其佔用的內存不能超過 6G 呢?
-
對於一個容器,比如 set,你想實現自定義排序規則的話怎麼做
-
數據庫中一行記錄大小 10K,一個表只有主鍵索引,可以存多少條數據
-
你有沒有試過數據庫一個表中最多可以插入多少數據
-
一個 6 位的密碼,使用 MD5 加密,破解需要多久:說的是這樣的,因爲 6 位的密碼排列組合有一定的種數,然後每一種通過 hash 函數去破解,需要多久
-
我有 8 件事要做,最要要同意返回處理結果,每件事要進行異步的方式去做。你怎麼完成這個需求
-
我需要在項目啓動時,將一些配置加載到內存中,你有什麼方式能解決
-
10g 文件,只有 2g 內存,怎麼查找文件中指定的字符串出現位置
-
100w 個數,怎麼找到前 1000 個最大的,堆排序?怎麼構造,怎麼調整,時間複雜度
-
十億個數的集合和 10w 個數的集合,如何求它們的交集
-
給定一個文本 有 5000 萬行數據,給 20 個線程,怎麼利用這 20 個線程,將這些數據同步到數據庫中?(生產者與消費者模型)
-
50 個紅球,50 個籃球,有兩個箱子,怎麼將這 100 個球放入箱子,讓另一個人隨機選取箱子並選取其中一個球,是紅球的概率最大
-
字符串有 20G 內存存不下,怎麼辦?
-
字符串有 1PB,硬盤都裝不下,怎麼辦?
-
一個 3 升的桶和一個 5 升的桶,怎麼得到 4 升的水
-
1 億個手機號碼,判斷重複
-
10G 的文件裏面的數字排序?
-
16 瓶正常水, 1 瓶毒水,小白鼠喝下毒水後一小時死亡,只給一小時時間,最少用多少隻小白鼠可以檢測出 14 瓶正常水
-
兩根質地不均勻但是燃燒時間與繩子長度無關的一樣的繩子,燃燒完一根繩子耗時一個小時,只能用這兩根繩子,如何準確燒出 15 分鐘?
內容暫時就這麼多,許多內容我博客還是有,就是寫博客還記得寫完了漸進式遺忘
等我吃透了會再總結下這些問題的答案思路再發出來
有用就點個贊吧!