2025年最新 Java 面經(jīng):拼多多后端面試真實復盤,附答案模板,速速收藏!
Java 一面
1,垃圾回收算法了解嗎?
Java 中的垃圾回收算法主要有以下幾種:
標記-清除算法(Mark-Sweep):
- 工作原理:首先遍歷堆中的對象,標記出所有的存活對象,接著清除未標記的對象。
- 優(yōu)點:實現(xiàn)簡單,能夠處理堆中的所有對象。
- 缺點:標記和清除的過程會產(chǎn)生內(nèi)存碎片,影響后續(xù)內(nèi)存分配的效率。
標記-整理算法(Mark-Compact):
- 工作原理:首先標記出所有存活的對象,然后將存活的對象整理到一邊,最后清除未標記的對象。
- 優(yōu)點:避免了內(nèi)存碎片問題。
- 缺點:整理階段需要移動對象,會導致額外的開銷。
復制算法(Copying):
- 工作原理:將內(nèi)存分成兩部分,每次只使用其中一半,垃圾回收時將存活的對象從一半復制到另一半,清除原區(qū)域的所有對象(樸素的復制算法是這樣的,實際使用會分為兩個 survivor 和一個 eden 區(qū))。
- 優(yōu)點:無需處理內(nèi)存碎片,分配效率高。
- 缺點:需要雙倍的內(nèi)存空間,浪費了一半的空間。
2,數(shù)據(jù)結(jié)構(gòu)知道嗎?
主要是以下七種數(shù)據(jù)結(jié)構(gòu):
1)數(shù)組(Array)
2)鏈表(Linked List)
3)棧(Stack)
4)隊列(Queue)
5)哈希表(HashMap/HashTable)
6)樹(Tree)
7)圖(Graph)
登陸面試鴨查看各數(shù)據(jù)結(jié)構(gòu)的特點、應用場景及局限性,還有更多大廠真實面經(jīng)、主流編程語言面試題,等你來刷。
3,HashMap 的原理
HashMap
是基于哈希表的數(shù)據(jù)結(jié)構(gòu),用于存儲鍵值對(key-value
)。其核心是將鍵的哈希值映射到數(shù)組索引位置,通過數(shù)組 + 鏈表(在 Java 8 及之后是數(shù)組 + 鏈表 + 紅黑樹)來處理哈希沖突。
HashMap
使用鍵的 hashCode()
方法計算哈希值,并通過 indexFor
方法(JDK 1.7 及之后版本移除了這個方法,直接使用 (n - 1) & hash
)確定元素在數(shù)組中的存儲位置。哈希值是經(jīng)過一定擾動處理的,防止哈希值分布不均勻,從而減少沖突。
HashMap
的默認初始容量為 16,負載因子為 0.75。也就是說,當存儲的元素數(shù)量超過 16 × 0.75 = 12 個時,HashMap
會觸發(fā)擴容操作,容量x2并重新分配元素位置。這種擴容是比較耗時的操作,頻繁擴容會影響性能。
4,哈希表的負載因子為什么是 0.75?
HashMap
的默認負載因子為 0.75 是為了在時間復雜度和空間復雜度之間取得一個合理的平衡。負載因子為 0.75 時,避免過多擴容的同時,也保證了不會出現(xiàn)過多的哈希沖突,確保查找和插入操作的效率,維持良好的性能表現(xiàn)。
5,你了解反射嗎?
Java 的反射機制是指在運行時獲取類的結(jié)構(gòu)信息(如方法、字段、構(gòu)造函數(shù))并操作對象的一種機制。反射機制提供了在運行時動態(tài)創(chuàng)建對象、調(diào)用方法、訪問字段等功能,而無需在編譯時知道這些類的具體信息。
反射機制的優(yōu)點:
- 可以動態(tài)地獲取類的信息,不需要在編譯時就知道類的信息。
- 可以動態(tài)地創(chuàng)建對象,不需要在編譯時就知道對象的類型。
- 可以動態(tài)地調(diào)用對象的屬性和方法,在運行時動態(tài)地改變對象的行為。
6,SpringBoot如何實現(xiàn)控制反轉(zhuǎn)?
可以利用 Spring IOC。
Spring IOC(Inversion of Control,控制反轉(zhuǎn))是 Spring 框架的核心概念之一。它是通過依賴注入(Dependency Injection) 實現(xiàn)的。IOC 讓對象的創(chuàng)建與管理職責由容器負責,而不是由對象自身控制。
- 核心思想:控制反轉(zhuǎn)意味著將對象的創(chuàng)建和依賴關(guān)系交由 Spring 容器管理,而不是由程序代碼直接控制。這種機制使得程序更加靈活和解耦,提升了代碼的可維護性和擴展性。
- 依賴注入:通過構(gòu)造器注入、setter 注入或接口注入,將對象所需的依賴傳遞給它,而不是讓對象自行創(chuàng)建依賴。
7,Spring是如何管理bean的?
任何通過 Spring 容器實例化、組裝和管理的 Java 對象都可以被稱為 Spring Bean。Spring 提供了多個擴展點,讓開發(fā)者可以自定義和控制 Bean 的生命周期,如 BeanPostProcessor、BeanFactoryPostProcessor
服務(wù)端一面
算法:最長連續(xù)遞增序列
為了找到最長的連續(xù)遞增子序列,我們需要逐一檢查數(shù)組元素,并追蹤當前遞增子序列的長度以及最長的遞增子序列長度。
我們可以采取如下步驟:
- 初始化一個變量
max_length
來存儲最長遞增子序列的長度。 - 初始化一個變量
current_length
來存儲當前遞增子序列的長度。 - 從數(shù)組的第二個元素開始遍歷:
- 如果當前元素比前一個元素大,則
current_length
加1。 - 否則,更新
max_length
為current_length
與max_length
中的較大值,并重置current_length
為1。
- 如果當前元素比前一個元素大,則
- 遍歷結(jié)束后,記得最后更新一次
max_length
,因為最長的遞增序列可能在數(shù)組末尾。
我們可以使用三種編程語言(Java, C++, Python)實現(xiàn)這一邏輯,具體代碼如下:
import java.util.Scanner;
public class LongestIncreasingSubsequence {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
System.out.println(findLengthOfLCIS(nums));
}
public static int findLengthOfLCIS(int[] nums) {
if (nums.length == 0) return 0;
int max_length = 1, current_length = 1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] > nums[i - 1]) {
current_length++;
} else {
max_length = Math.max(max_length, current_length);
current_length = 1;
}
}
return Math.max(max_length, current_length);
}
}
為什么要分新生代和老年代?
主要是為了提高垃圾回收效率,依據(jù)對象的生命周期特點來進行優(yōu)化。
為什么 Java 新生代被劃分為 S0、S1 和 Eden 區(qū)?
主要是為了提高新生代內(nèi)存的利用率。
你用過 Java 的哪些并發(fā)工具類?
比如:ConcurrentHashMap、AtomicInteger、Semaphore、CyclicBarrier、CountDownLatch、BlockingQueue 等等。
這個問題只要把你知道的一些并發(fā)類名字說出來就行了,然后等面試官選擇其中一個去詢問即可(一般需要結(jié)合簡歷中項目的業(yè)務(wù)場景,所以需要根據(jù)自己的業(yè)務(wù)提前準備)。
具體的并發(fā)類分析可以上【面試鴨】看擴展知識。
Spring 框架有什么好處?
- [758. Spring 的優(yōu)點]
Spring 容器啟動時如何初始化的?
- [761. Spring IOC 容器初始化過程?]
你對設(shè)計模式有掌握嗎?
- [1416. 談?wù)勀懔私獾淖畛R姷膸追N設(shè)計模式,說說他們的應用場景]
為什么單例模式要雙檢?
- [1126. 單例模式有哪幾種實現(xiàn)?如何保證線程安全?]
堆是一種什么樣的數(shù)據(jù)結(jié)構(gòu)?
堆(Heap)是一種特殊的樹形數(shù)據(jù)結(jié)構(gòu),滿足特定的性質(zhì),通常用于優(yōu)先級隊列、排序算法和其他需要高效最值操作的場景。
插入操作、刪除:時間復雜度:O(log n);構(gòu)建堆:時間復雜度:O(n);獲取堆頂時間復雜度:O(1)
你了解不同的排序算法嗎?
- [5915. 常見八大排序算法的穩(wěn)定性]
你了解不同的索引嗎?有哪些?
- [591. MySQL 的索引類型有哪些?]
如何改進慢查詢?
- [631. 如何在 MySQL 中監(jiān)控和優(yōu)化慢 SQL?]
后端社招一面
如何進行 MySQL 調(diào)優(yōu)?
- [616. MySQL 中如何進行 SQL 調(diào)優(yōu)?]
- [631. 如何在 MySQL 中監(jiān)控和優(yōu)化慢 SQL?]
Redis 事務(wù)和 MySQL 事務(wù)有什么區(qū)別?
- [602. MySQL 是如何實現(xiàn)事務(wù)的?]
- [641. Redis 支持事務(wù)嗎?如何實現(xiàn)?]
什么是 Spring IOC?
- [563. 什么是 Spring IOC?]
- [564. Spring IOC 有什么好處?]
什么是 Java 反射?
- [432. 你使用過 Java 的反射機制嗎?如何應用反射?]
請簡述不同集合類型(如 Map,HashMap,隊列)的特點和適用場景。
Java 中的集合類主要分為兩大類:Collection 接口和 Map 接口。前者是存儲對象的集合類,后者存儲的是鍵值對(key-value)。
HashMap | 快速存取鍵值對,無序 | 做本地緩存、字典映射 |
TreeMap | 按鍵排序 | 范圍查詢、有序統(tǒng)計 |
ArrayList | 快速隨機訪問,插入/刪除效率低 | 數(shù)據(jù)列表、緩存 |
LinkedList | 插入/刪除效率高,隨機訪問效率低 | 隊列、棧 |
HashSet | 去重,無序 | 用戶 ID、去重數(shù)據(jù) |
TreeSet | 去重,按鍵排序 | 成績排名、有序集合 |
算法:如何手寫實現(xiàn)廣度優(yōu)先搜索算法(BFS)?
- [5389. 圖的廣度優(yōu)先搜索]
你用過 RPC 嗎?如果是你,你應該怎么設(shè)計一個 RPC?
- [338. 什么是 RPC 框架?它有什么優(yōu)點?]
- [732.讓你設(shè)計一個 RPC 框架,怎么設(shè)計?]
#面經(jīng)#更多大廠面經(jīng)、詳細題解、其他主流編程語言面試題庫,********************************************