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

服务端一面

算法:最长连续递增序列

为了找到最长的连续递增子序列,我们需要逐一检查数组元素,并追踪当前递增子序列的长度以及最长的递增子序列长度。

我们可以采取如下步骤:

  1. 初始化一个变量 max_length 来存储最长递增子序列的长度。
  2. 初始化一个变量 current_length 来存储当前递增子序列的长度。
  3. 从数组的第二个元素开始遍历:
    • 如果当前元素比前一个元素大,则current_length加1。
    • 否则,更新max_lengthcurrent_lengthmax_length中的较大值,并重置current_length为1。
  4. 遍历结束后,记得最后更新一次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?]

alt

后端社招一面

如何进行 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 框架,怎么设计?]

更多大厂面经、详细题解、其他主流编程语言面试题库,********************************************

#面经#
全部评论

相关推荐

评论
1
5
分享

创作者周榜

更多
牛客网
牛客企业服务