java的程式設計思想電子書,Java面試知識點整理
01 阿里中介軟體(四面,Java崗)
1.1 Java中介軟體一面
技術一面考察範圍
重點問了Java執行緒鎖:synchronized 和ReentrantLock相關的底層實現 執行緒池的底層實現以及常見的引數 資料結構基本都問了一遍:連結串列、佇列等 Java記憶體模型:常問的JVM分代模型,以及JDK1.8後的區別,最後還問了JVM相關的調優引數 分散式鎖的實現比較技術
一面題目
-
自我介紹
-
擅長哪方面的技術?
-
java有哪些鎖中類?(樂觀鎖&悲觀鎖、可重入鎖&Synchronize等)。
-
比較重要的資料結構,如連結串列,佇列,棧的基本原理及大致實現
-
J.U.C下的常見類的使用。Threadpool的深入考察;blockingQueue的使用
-
Java記憶體分代模型,GC演算法,JVM常見的啟動引數;CMS演算法的過程。
-
Volatile關鍵字有什麼用(包括底層原理)
-
執行緒池的調優策略
-
Spring cloud的服務註冊與發現是怎麼設計的?
-
分散式系統的全域性id如何實現
-
分散式鎖的方案,redis和zookeeper那個好,如果是叢集部署,高併發情況下那個效能更好。
1.2 Java中介軟體二面
技術二面考察範圍:
問了專案相關的技術實現細節 資料庫相關:索引、索引底層實現、mysql相關的行鎖、表鎖等 redis相關:架構設計、資料一致性問題 容器:容器的設計原理等技術
二面題目:
-
參與的專案,選一個,技術難度在哪裡?
-
Collections.sort底層排序方式
-
負載均衡的原理設計模式與重構,談談你對重構的理解
-
談談redis相關的叢集有哪些成熟方案?
-
再談談一致hash演算法(redis)?
-
資料庫索引,B+樹的特性和建樹過程
-
Mysql相關的行鎖,表鎖;樂觀鎖,悲觀鎖
-
談談多執行緒和併發工具的使用
-
談談redis的架構和元件
-
Redis的資料一致性問題(分散式多節點環境&單機環境)
-
Docker容器
1.3 Java中介軟體三面
技術三面考察範圍:
主要談到了高併發的實現方案 以及中介軟體:redis、rocketmq、kafka等的架構設計思路 最後問了平時怎麼提升技術的技術
三面題目
-
高併發情況下,系統是如何支撐大量的請求的?
-
接著上面的問題,延伸到了中介軟體,kafka、redis、rocketmq、mycat等設計思路和適用場景等
-
最近上過哪些技術網站;最近再看那些書。
-
工作和生活中遇見最大的挑戰,怎麼去克服?
-
未來有怎樣的打算
1.4 Java中介軟體四面
最後,你懂的,主要就是HR走流程了,主要問了未來的職業規劃。
02 頭條Java後臺3面
2.1 頭條一面
-
講講jvm執行時資料庫區
-
講講你知道的垃圾回收演算法
-
jvm記憶體模型jmm
-
記憶體洩漏與記憶體溢位的區別
-
select、epool 的區別?底層的資料結構是什麼?
-
mysql資料庫預設儲存引擎,有什麼優點
-
優化資料庫的方法,從sql到快取到cpu到作業系統,知道多少說多少
-
什麼情景下做分表,什麼情景下做分庫
-
linkedList與arrayList區別 適用場景
-
array list是如何擴容的
-
volatile 關鍵字的作用?Java 記憶體模型?
-
java lock的實現,公平鎖、非公平鎖
-
悲觀鎖和樂觀鎖,應用中的案例,mysql當中怎麼實現,java中的實現
2.2 頭條二面
-
Java 記憶體分配策略?
-
多個執行緒同時請求記憶體,如何分配?
-
Redis 底層用到了哪些資料結構?
-
使用 Redis 的 set 來做過什麼?
-
Redis 使用過程中遇到什麼問題?
-
搭建過 Redis 叢集嗎?
-
如何分析“慢查詢”日誌進行 SQL/索引 優化?
-
MySQL 索引結構解釋一下?(B+ 樹)
-
MySQL Hash 索引適用情況?舉下例子?
2.3 頭條三面
-
如何保證資料庫與redis快取一致的Redis 的併發競爭問題是什麼?
-
如何解決這個問題?
-
瞭解 Redis 事務的 CAS 方案嗎?
-
如何保證 Redis 高併發、高可用?
-
Redis 的主從複製原理,以及Redis 的哨兵原理?
-
如果讓你寫一個訊息佇列,該如何進行架構設計啊?說一下你的思路。
-
MySQL資料庫主從同步怎麼實現?
-
秒殺模組怎麼設計的,如何壓測,抗壓手段
03 今日頭條Java後臺研發三面
3.1 一面
-
concurrent包下面用過哪些?
-
countdownlatch功能實現
-
synchronized和lock區別,重入鎖thread和runnable的區別
-
AtomicInteger實現原理(CAS自旋)
-
java併發sleep與wait、notify與notifyAll的區別
-
如何實現高效的同步連結串列
-
java都有哪些加鎖方式(synchronized、ReentrantLock、共享鎖、讀寫鎖等)
-
設計模式(工廠模式、單例模式(幾種情況)、介面卡模式、裝飾者模式)
-
maven依賴樹,maven的依賴傳遞,迴圈依賴
3.2 二面
-
synchronized和reentrantLock的區別,synchronized用在程式碼快、方法、靜態方法時鎖的都是什麼?
-
介紹spring的IOC和AOP,分別如何實現(classloader、動態代理)JVM的記憶體佈局以及垃圾回收原理及過程
-
講一下,講一下CMS垃圾收集器垃圾回收的流程,以及CMS的缺點
-
redis如何處理分散式伺服器併發造成的不一致OSGi的機制spring中bean載入機制,bean生成的具體步驟,ioc注入的方式spring何時建立- applicationContextlistener是監聽哪個事件?
-
介紹ConcurrentHashMap原理,用的是哪種鎖,segment有沒可能增大?
-
解釋mysql索引、b樹,為啥不用平衡二叉樹、紅黑樹
-
Zookeeper如何同步配置
3.3 三面
-
Java執行緒池ThreadPoolEcecutor引數,基本引數,使用場景
-
MySQL的ACID講一下,延伸到隔離級別
-
dubbo的實現原理,說說RPC的要點
-
GC停頓原因,如何降低停頓?
-
JVM如何調優、引數怎麼調?
-
如何用工具分析jvm狀態(visualVM看堆中物件的分配,物件間的引用、是否有記憶體洩漏,jstack看執行緒狀態、是否死鎖等等)
-
描述一致性hash演算法
-
分散式雪崩場景如何避免?
-
再談談訊息佇列
04 抖音Java 三面
4.1 一面:
-
hashmap,怎麼擴容,怎麼處理資料衝突?
-
怎麼高效率的實現資料遷移?
-
Linux的共享記憶體如何實現,大概說了一下。
-
socket網路程式設計,說一下TCP的三次握手和四次揮手同步IO和非同步IO的區別?
-
Java GC機制?GC Roots有哪些?
-
紅黑樹講一下,五個特性,插入刪除操作,時間複雜度?
-
快排的時間複雜度,最壞情況呢,最好情況呢,堆排序的時間複雜度呢,建堆的複雜度是多少
4.2 二面:
-
自我介紹,主要講講做了什麼和擅長什麼
-
設計模式瞭解哪些?
-
AtomicInteger怎麼實現原子修改的?
-
ConcurrentHashMap 在Java7和Java8中的區別?
-
為什麼Java8併發效率更好?什麼情況下用HashMap,什麼情況用ConcurrentHashMap?
-
redis資料結構?
-
redis資料淘汰機制?
4.3 三面(約五十分鐘):
-
mysql實現事務的原理(MVCC)
-
MySQL資料主從同步是如何實現的?
-
MySQL索引的實現,innodb的索引,b+樹索引是怎麼實現的,為什麼用b+樹做索引節點,一個節點存了多少資料,怎麼規定大小,與磁碟頁對應。
-
如果Redis有1億個key,使用keys命令是否會影響線上服務?
-
Redis的持久化方式,aod和rdb,具體怎麼實現,追加日誌和備份檔案,底層實現原理的話知道麼?
-
遇到最大困難是什麼?怎麼克服?
-
未來的規劃是什麼?
-
你想問我什麼?
05 百度三面
5.1 百度一面
-
自我介紹
-
Java中的多型
-
為什麼要同時重寫hashcode和equals
-
Hashmap的原理
-
Hashmap如何變執行緒安全,每種方式的優缺點
-
垃圾回收機制
-
Jvm的引數你知道的說一下
-
設計模式瞭解的說一下啊
-
手撕一個單例模式
-
手撕演算法:反轉單鏈表
-
手撕演算法:實現類似微博子結構的資料結構,輸入一系列父子關係,輸出一個類似微博評論的父子結構圖
-
手寫java多執行緒
-
手寫java的soeket程式設計,服務端和客戶端
-
手撕演算法: 爬樓梯,寫出狀態轉移方程
-
智力題:時針分針什麼時候重合
5.2 百度二面(現場)
-
自我介紹
-
專案介紹
-
伺服器如何負載均衡,有哪些演算法,哪個比較好,一致性雜湊原理,怎麼避免DDOS攻擊請求打到少數機器。
-
TCP連線中的三次握手和四次揮手,四次揮手的最後一個ack的作用是什麼,為什麼要time wait,為什麼是2msl。
-
資料庫的備份和恢復怎麼實現的,主從複製怎麼做的,什麼時候會出現資料不一致,如何解決。
-
Linux檢視cpu佔用率高的程序
-
手撕演算法:給定一個數字三角形,找到從頂部到底部的最小路徑和。每一步可以移動到下面一行的相鄰數字上。
-
然後繼續在這個問題上擴充套件
-
求出最短那條的路徑
-
遞迴求出所有的路徑
-
設計模式講一下熟悉的
-
會不會濫用設計模式
-
多執行緒條件變數為什麼要在while體裡
-
你遇到什麼挫折,怎麼應對和處理
5.3 百度三面(現場)
-
自我介紹
-
專案介紹
-
Redis的特點
-
Redis的持久化怎麼做,aof和rdb,有什麼區別,有什麼優缺點。
-
Redis使用哨兵部署會有什麼問題,我說需要擴容的話還是得叢集部署。
-
說一下JVM記憶體模型把,有哪些區,分別幹什麼的
-
說一下gc演算法,分代回收說下
-
MySQL的引擎講一下,有什麼區別,使用場景呢
-
分散式事務瞭解麼
-
反爬蟲的機制,有哪些方式
06 螞蟻中介軟體團隊面試題
6.1 螞蟻中介軟體一面:
-
自我介紹
-
JVM垃圾回收演算法和垃圾回收器有哪些,最新的JDK採用什麼演算法。
-
新生代和老年代的回收機制。
-
講一下ArrayList和linkedlist的區別,ArrayList與HashMap的擴容方式。
-
Concurrenthashmap1.8後的改動。
-
Java中的多執行緒,以及執行緒池的增長策略和拒絕策略瞭解麼。
-
Tomcat的類載入器瞭解麼
-
Spring的ioc和aop,Springmvc的基本架構,請求流程。
-
HTTP協議與Tcp有什麼區別,http1.0和2.0的區別。
-
Java的網路程式設計,講講NIO的實現方式,與BIO的區別,以及介紹常用的NIO框架。
-
索引什麼時候會失效變成全表掃描
-
介紹下分散式的paxos和raft演算法
6.2 螞蟻中介軟體二面
-
你在專案中怎麼用到併發的。
-
訊息佇列的使用場景,談談Kafka。
-
你說了解分散式服務,那麼你怎麼理解分散式服務。
-
Dubbo和Spring Clound的區別,以及使用場景。
-
講一下docker的實現原理,以及與JVM的區別。
-
MongoDB、Redis和Memcached的應用場景,各自優勢
-
MongoDB有事務嗎
-
Redis說一下sorted set底層原理
-
講講Netty為什麼併發高,相關的核心元件有哪些
6.3 螞蟻中介軟體三面
-
完整的畫一個分散式叢集部署圖,從負載均衡到後端資料庫叢集。
-
分散式鎖的方案,Redis和Zookeeper哪個好,如果是叢集部署,高併發情況下哪個效能更好。
-
分散式系統的全域性id如何實現。
-
資料庫萬級變成億級,你如何來解決。
-
常見的伺服器雪崩是由什麼引起的,如何來防範。
-
異地容災怎麼實現
-
常用的高併發技術解決方案有哪些,以及對應的解決步驟。
07 京東4面(Java研發)
7.1 一面(基礎面:約1小時)
-
自我介紹,主要講講做了什麼和擅長什麼
-
springmvc和spring-boot區別
-
@Autowired的實現原理
-
Bean的預設作用範圍是什麼?其他的作用範圍?
-
索引是什麼概念有什麼作用?MySQL裡主要有哪些索引結構?雜湊索引和B+樹索引比較?
-
Java執行緒池的原理?執行緒池有哪些?執行緒池工廠有哪些執行緒池型別,及其執行緒池引數是什麼?
-
hashmap原理,處理雜湊衝突用的哪種方法?
-
還知道什麼處理雜湊衝突的方法?
-
Java GC機制?GC Roots有哪些?
-
Java怎麼進行垃圾回收的?什麼物件會進老年代?垃圾回收演算法有哪些?為什麼新生代使用複製演算法?
-
HashMap的時間複雜度?HashMap中Hash衝突是怎麼解決的?連結串列的上一級結構是什麼?Java8中的HashMap有什麼變化?紅黑樹需要比較大小才能進行插入,是依據什麼進行比較的?其他Hash衝突解決方式?
-
hash和B+樹的區別?分別應用於什麼場景?哪個比較好?
-
專案裡有個資料安全的,aes和md5的區別?詳細點
7.2 二面(問資料庫較多)
-
自我介紹
-
為什麼MyISAM查詢效能好?
-
事務特性(acid)
-
隔離級別
-
SQL慢查詢的常見優化步驟?
-
說下樂觀鎖,悲觀鎖(select for update),並寫出sql實現
-
TCP協議的三次握手和四次揮手過程?
-
用到過哪些rpc框架
-
資料庫連線池怎麼實現
-
Java web過濾器的生命週期
7.3 三面(綜合面;約一個小時)
-
自我介紹。
-
ConcurrentHashMap 在Java7和Java8中的區別?為什麼Java8併發效率更好?什麼情況下用HashMap,什麼情況用ConcurrentHashMap?
-
加鎖有什麼機制?
-
ThreadLocal?應用場景?
-
資料庫水平切分,垂直切分的設計思路和切分順序
-
Redis如何解決key衝突
-
soa和微服務的區別?
-
單機系統演變為分散式系統,會涉及到哪些技術的調整?請從前面負載到後端詳細描述。
-
設計一個秒殺系統?
7.4 四面(HR面)
-
你自己最大優勢和劣勢是什麼
-
平時遇見過什麼樣的挑戰,怎麼去克服的
-
工作中遇見了技術解決不了的問題,你的應對思路?
-
你的興趣愛好?
-
未來的職業規劃是什麼?
08 美團java高階開發3面
8.1 美團一面
-
自我介紹
-
專案介紹
-
Redis介紹
-
瞭解redis原始碼麼
-
瞭解redis叢集麼
-
Hashmap的原理,增刪的情況後端資料結構如何位移
-
hashmap容量為什麼是2的冪次
-
hashset的原始碼
-
object類你知道的方法
-
hashcode和equals
-
你重寫過hashcode和equals麼,要注意什麼
-
假設現在一個學生類,有學號和姓名,我現在hashcode方法重寫的時候,只將學號參與計算,會出現什麼情況?
-
往set裡面put一個學生物件,然後將這個學生物件的學號改了,再put進去,可以放進set麼?並講出為什麼
-
Redis的持久化?有哪些方式,原理是什麼?
-
講一下穩定的排序演算法和不穩定的排序演算法
-
講一下快速排序的思想
8.2 美團二面
-
自我介紹
-
講一下資料的acid
-
什麼是一致性
-
什麼是隔離性
-
Mysql的隔離級別
-
每個隔離級別是如何解決
-
Mysql要加上nextkey鎖,語句該怎麼寫
-
Java的記憶體模型,垃圾回收
-
執行緒池的引數
-
每個引數解釋一遍
-
然後面試官設定了每個引數,給了是個執行緒,讓描述出完整的執行緒池執行的流程
-
Nio和IO有什麼區別
-
Nio和aio的區別
-
Spring的aop怎麼實現
-
Spring的aop有哪些實現方式
-
動態代理的實現方式和區別
-
Linux瞭解麼
-
怎麼檢視系統負載
-
Cpu load的引數如果為4,描述一下現在系統處於什麼情況
-
Linux,查詢磁碟上最大的檔案的命令
-
Linux,如何檢視系統日誌檔案
-
手撕演算法:leeetcode原題 22,Generate Parentheses,給定 n 對括號,請- 寫一個函式以將其生成新的括號組合,並返回所有組合結果。
8.3 美團三面(現場)
三面沒怎麼問技術,問了很多技術管理方面的問題
-
自我介紹
-
專案介紹
-
怎麼管理專案成員
-
當意見不一致時,如何溝通並說服開發成員,並舉個例子
-
怎麼保證專案的進度
-
資料庫的索引原理
-
非聚簇索引和聚簇索引
-
索引的使用注意事項
-
聯合索引
-
從底層解釋最左匹配原則
-
Mysql對聯合索引有優化麼?會自動調整順序麼?哪個版本開始優化?
-
Redis的應用
-
Redis的持久化的方式和原理
-
技術選型,一個新技術和一個穩定的舊技術,你會怎麼選擇,選擇的考慮有哪些
-
說你印象最深的美團點評技術團隊的三篇部落格
-
最近在學什麼新技術
-
你是怎麼去接觸一門新技術的
-
會看哪些書
-
怎麼選擇要看的書
最近我根據上述的技術體系圖蒐集了幾十套騰訊、頭條、阿里、美團等公司21年的面試題,把技術點整理成了視訊(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節,由於篇幅有限,這裡以圖片的形式給大家展示一部分