2025年最新 Java 面经:拼多多后端面试真实复盘,附答案模板,速速收藏!
Java 一面
1,垃圾回收算法了解吗?
Java 中的垃圾回收算法主要有以下几种:
标记-清除算法(Mark-Sweep):
- 工作原理:首先遍历堆中的对象,标记出所有的存活对象,接着清除未标记的对象。
- 优点:实现简单,能够处理堆中的所有对象。
- 缺点:标记和清除的过程会产生内存碎片,影响后续内存分配的效率。
标记-整理算法(Mark-Compact):
- 工作原理:首先标记出所有存活的对象,然后将存活的对象整理到一边,最后清除未标记的对象。
- 优点:避免了内存碎片问题。
- 缺点:整理阶段需要移动对象,会导致额外的开销。
复制算法(Copying):
- 工作原理:将内存分成两部分,每次只使用其中一半,垃圾回收时将存活的对象从一半复制到另一半,清除原区域的所有对象(朴素的复制算法是这样的,实际使用会分为两个 survivor 和一个 eden 区)。
- 优点:无需处理内存碎片,分配效率高。
- 缺点:需要双倍的内存空间,浪费了一半的空间。
2,数据结构知道吗?
主要是以下七种数据结构:
1)数组(Array)
2)链表(Linked List)
3)栈(Stack)
4)队列(Queue)
5)哈希表(HashMap/HashTable)
6)树(Tree)
7)图(Graph)
登陆面试鸭查看各数据结构的特点、应用场景及局限性,还有更多大厂真实面经、主流编程语言面试题,等你来刷。
3,HashMap 的原理
HashMap
是基于哈希表的数据结构,用于存储键值对(key-value
)。其核心是将键的哈希值映射到数组索引位置,通过数组 + 链表(在 Java 8 及之后是数组 + 链表 + 红黑树)来处理哈希冲突。
HashMap
使用键的 hashCode()
方法计算哈希值,并通过 indexFor
方法(JDK 1.7 及之后版本移除了这个方法,直接使用 (n - 1) & hash
)确定元素在数组中的存储位置。哈希值是经过一定扰动处理的,防止哈希值分布不均匀,从而减少冲突。
HashMap
的默认初始容量为 16,负载因子为 0.75。也就是说,当存储的元素数量超过 16 × 0.75 = 12 个时,HashMap
会触发扩容操作,容量x2并重新分配元素位置。这种扩容是比较耗时的操作,频繁扩容会影响性能。
4,哈希表的负载因子为什么是 0.75?
HashMap
的默认负载因子为 0.75 是为了在时间复杂度和空间复杂度之间取得一个合理的平衡。负载因子为 0.75 时,避免过多扩容的同时,也保证了不会出现过多的哈希冲突,确保查找和插入操作的效率,维持良好的性能表现。
5,你了解反射吗?
Java 的反射机制是指在运行时获取类的结构信息(如方法、字段、构造函数)并操作对象的一种机制。反射机制提供了在运行时动态创建对象、调用方法、访问字段等功能,而无需在编译时知道这些类的具体信息。
反射机制的优点:
- 可以动态地获取类的信息,不需要在编译时就知道类的信息。
- 可以动态地创建对象,不需要在编译时就知道对象的类型。
- 可以动态地调用对象的属性和方法,在运行时动态地改变对象的行为。
6,SpringBoot如何实现控制反转?
可以利用 Spring IOC。
Spring IOC(Inversion of Control,控制反转)是 Spring 框架的核心概念之一。它是通过依赖注入(Dependency Injection) 实现的。IOC 让对象的创建与管理职责由容器负责,而不是由对象自身控制。
- 核心思想:控制反转意味着将对象的创建和依赖关系交由 Spring 容器管理,而不是由程序代码直接控制。这种机制使得程序更加灵活和解耦,提升了代码的可维护性和扩展性。
- 依赖注入:通过构造器注入、setter 注入或接口注入,将对象所需的依赖传递给它,而不是让对象自行创建依赖。
7,Spring是如何管理bean的?
任何通过 Spring 容器实例化、组装和管理的 Java 对象都可以被称为 Spring Bean。Spring 提供了多个扩展点,让开发者可以自定义和控制 Bean 的生命周期,如 BeanPostProcessor、BeanFactoryPostProcessor
服务端一面
算法:最长连续递增序列
为了找到最长的连续递增子序列,我们需要逐一检查数组元素,并追踪当前递增子序列的长度以及最长的递增子序列长度。
我们可以采取如下步骤:
- 初始化一个变量
max_length
来存储最长递增子序列的长度。 - 初始化一个变量
current_length
来存储当前递增子序列的长度。 - 从数组的第二个元素开始遍历:
- 如果当前元素比前一个元素大,则
current_length
加1。 - 否则,更新
max_length
为current_length
与max_length
中的较大值,并重置current_length
为1。
- 如果当前元素比前一个元素大,则
- 遍历结束后,记得最后更新一次
max_length
,因为最长的递增序列可能在数组末尾。
我们可以使用三种编程语言(Java, C++, Python)实现这一逻辑,具体代码如下:
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);
}
}
为什么要分新生代和老年代?
主要是为了提高垃圾回收效率,依据对象的生命周期特点来进行优化。
为什么 Java 新生代被划分为 S0、S1 和 Eden 区?
主要是为了提高新生代内存的利用率。
你用过 Java 的哪些并发工具类?
比如:ConcurrentHashMap、AtomicInteger、Semaphore、CyclicBarrier、CountDownLatch、BlockingQueue 等等。
这个问题只要把你知道的一些并发类名字说出来就行了,然后等面试官选择其中一个去询问即可(一般需要结合简历中项目的业务场景,所以需要根据自己的业务提前准备)。
具体的并发类分析可以上【面试鸭】看扩展知识。
Spring 框架有什么好处?
- [758. Spring 的优点]
Spring 容器启动时如何初始化的?
- [761. Spring IOC 容器初始化过程?]
你对设计模式有掌握吗?
- [1416. 谈谈你了解的最常见的几种设计模式,说说他们的应用场景]
为什么单例模式要双检?
- [1126. 单例模式有哪几种实现?如何保证线程安全?]
堆是一种什么样的数据结构?
堆(Heap)是一种特殊的树形数据结构,满足特定的性质,通常用于优先级队列、排序算法和其他需要高效最值操作的场景。
插入操作、删除:时间复杂度:O(log n);构建堆:时间复杂度:O(n);获取堆顶时间复杂度:O(1)
你了解不同的排序算法吗?
- [5915. 常见八大排序算法的稳定性]
你了解不同的索引吗?有哪些?
- [591. MySQL 的索引类型有哪些?]
如何改进慢查询?
- [631. 如何在 MySQL 中监控和优化慢 SQL?]
后端社招一面
如何进行 MySQL 调优?
- [616. MySQL 中如何进行 SQL 调优?]
- [631. 如何在 MySQL 中监控和优化慢 SQL?]
Redis 事务和 MySQL 事务有什么区别?
- [602. MySQL 是如何实现事务的?]
- [641. Redis 支持事务吗?如何实现?]
什么是 Spring IOC?
- [563. 什么是 Spring IOC?]
- [564. Spring IOC 有什么好处?]
什么是 Java 反射?
- [432. 你使用过 Java 的反射机制吗?如何应用反射?]
请简述不同集合类型(如 Map,HashMap,队列)的特点和适用场景。
Java 中的集合类主要分为两大类:Collection 接口和 Map 接口。前者是存储对象的集合类,后者存储的是键值对(key-value)。
HashMap | 快速存取键值对,无序 | 做本地缓存、字典映射 |
TreeMap | 按键排序 | 范围查询、有序统计 |
ArrayList | 快速随机访问,插入/删除效率低 | 数据列表、缓存 |
LinkedList | 插入/删除效率高,随机访问效率低 | 队列、栈 |
HashSet | 去重,无序 | 用户 ID、去重数据 |
TreeSet | 去重,按键排序 | 成绩排名、有序集合 |
算法:如何手写实现广度优先搜索算法(BFS)?
- [5389. 图的广度优先搜索]
你用过 RPC 吗?如果是你,你应该怎么设计一个 RPC?
- [338. 什么是 RPC 框架?它有什么优点?]
- [732.让你设计一个 RPC 框架,怎么设计?]
#面经#更多大厂面经、详细题解、其他主流编程语言面试题库,********************************************