2025 年最全 Java 面试题,京东后端面试面经合集,答案汇总
最近京东搞了个 TGT 计划,针对顶尖青年技术天才,直接宣布不设薪资上限。TGT 计划面向范围包括 2023 年 10 月 1 日到 2026 年 9 月 30 日毕业的海内外本硕博毕业生。时间范围还挺宽松的,有想法的同学可以试一试。
京东这两年一直在高薪招人,去年东哥给的年终也很吸引人。零售部门 A+ 能拿满 8 个月,锁定 20 薪。
今天分享几位同学京东后端社招和实习的面经,大家一起来查缺补漏,完善自己的技术栈。
后端一面
1,ArrayList 和 LinkedList 的区别是什么?
底层数据结构不同:
- ArrayList:基于动态数组实现,元素在内存中连续存储。
- LinkedList:基于双向链表实现,元素通过节点链接,内存中不需要连续存储。
性能区别:
1)ArrayList:
- 随机访问速度快,查找元素的时间复杂度为 O(1)。
- 插入和删除操作慢,尤其是在中间插入或删除时,时间复杂度为 O(n),因为需要移动后续元素。
2)LinkedList:
- 随机访问速度慢,查找元素的时间复杂度为 O(n)。
- 插入和删除操作快,尤其是在头尾插入或删除时,时间复杂度为 O(1)。
2,同步和异步的区别是什么?
同步(Synchronous)*和*异步(Asynchronous) 是两种不同的任务执行方式,主要区别在于任务的执行是否需要等待其他任务完成。
3,Java 如何创建多线程?
常见有以下五种方式创建使用多线程:
1)实现 Runnable
接口:
- 实现
Runnable
接口的run()
方法,使用Thread
类的构造函数传入Runnable
对象,调用start()
方法启动线程。 - 例子:
Thread thread = new Thread(new MyRunnable()); thread.start();
2)继承 Thread
类:
- 继承
Thread
类并重写run()
方法,直接创建Thread
子类对象并调用start()
方法启动线程。 - 例子:
MyThread thread = new MyThread(); thread.start();
3)使用 Callable
和 FutureTask
:
- 实现
Callable
接口的call()
方法,使用FutureTask
包装Callable
对象,再通过Thread
启动。 - 例子:
FutureTask<Integer> task = new FutureTask<>(new MyCallable()); Thread thread = new Thread(task); thread.start();
4)使用线程池(ExecutorService
):
- 通过
ExecutorService
提交Runnable
或Callable
任务,不直接创建和管理线程,适合管理大量并发任务。 - 例子:
ExecutorService executor = Executors.newFixedThreadPool(10); executor.submit(new MyRunnable());
5)CompletableFuture(本质也是线程池,默认 forkjoinpool):
- Java 8 引入的功能,非常方便地进行异步任务调用,且通过
thenApply
、thenAccept
等方法可以轻松处理异步任务之间的依赖关系。 CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {});
4,浏览器输入 URL 后会发生什么?
浏览器会解析 URL,然后经 DNS 解析、缓存检查、DNS解析获取服务器IP、TCP三次握手建立连接、发送HTTP请求与接收响应、浏览器解析资源并渲染页面等核心步骤,浏览器最终会接收到服务器返回的响应,进行页面渲染展示。
具体流程分析,欢迎来*****获取,还有更多 Java、Go、python、C++、PHP 等面试题及详细题解。
5,什么是 DNS 缓存机制?
DNS 会将查询结果临时存储在本地,以减少 DNS 解析的次数。 当用户访问某个域名时,如果缓存中已有对应的解析结果,就可以直接使用缓存数据,而不需要重新请求 DNS 服务器。
6,DNS 有几个级缓存?
- 浏览器缓存(TTL 通常几分钟到几小时)
- 操作系统缓存(Windows/Linux/macOS 维护的本地 DNS 缓存)
- 路由器缓存(家庭或企业路由器可能缓存 DNS 结果)
- 本地 ISP DNS 服务器缓存(ISP 提供的 DNS 服务器缓存大量常用域名)
- CDN 和权威 DNS 服务器缓存(用于优化全局 DNS 解析)
7,HTTP 301 和 302 的区别是什么?
- 5898 常见的 HTTP 状态码有哪些?
8,如何配置 Nginx 进行反向代理?
- 2568 在 Nginx 中,如何配置反向代理?
9,为什么在消息队列中选择 RabbitMQ 而不是 Kafka?
- 41 为什么使用 RabbitMQ 这个消息队列?它相比于其他的消息队列有哪些优点和缺点?
10,为什么先写 MySQL 再删除 Redis?
- 660 Redis 中如何保证缓存与数据库的数据一致性?
11,算法:如何翻转链表?
- 5534 反转链表
后端一面
1,项目用到了哪些设计模式?
工作中常用的就是单例模式、简单工厂、策略、模板等设计模式。需要确保某个类只有一个实例,并提供一个全局访问点的时候,就能用到单例模式。很多时候设计模式在工作中都是组合使用的。
2,AOP 的原理是什么?
AOP(Aspect-Oriented Programming,面向切面编程) 是一种编程范式,AOP 的核心思想是将与业务逻辑无关的横切关注点抽取出来,通过声明的方式动态地应用到业务方法上,而不是将这些代码直接嵌入业务逻辑中。
3,Java 中哪些类使用了单例模式?
比如 Calendar:
▼java
复制代码Calendar calendar = Calendar.getInstance();
比如 Logger:
▼java
复制代码Logger logger = Logger.getLogger(MyClass.class.getName());
4,你对进程、线程和协程的理解是什么?
进程:是资源分配的基本单位,进程之间是相互独立的。
线程:是 CPU 调度的基本单位,属于进程,一个进程中可以包含多个线程。
协程(Coroutine)是一种轻量级的线程,它允许在执行中暂停并在之后恢复执行,而无需阻塞线程。
5,进程通信有哪些方式?
如:管道(Pipes)、命名管道(Named Pipes)、消息队列(Message Queues)、共享内存(Shared Memory)、信号量(Semaphores)、信号(Signal)、套接字(Sockets)、文件(File)。
篇幅限制,各通信方式的详细介绍可以【点击此处获取】。
上*****,获取更多面试题解和扩展知识。
6,Hashtable 和 ConcurrentHashMap 有什么区别?
它们都是 Java 中常用的线程安全的哈希表实现,它们主要在性能有显著的差异。
因为在线程安全性上的实现方式不同,导致了它们性能上的差别:
Hashtable
:Hashtable
使用的是单一的锁机制(全表锁),即对整个哈希表进行同步,所有的操作(如插入、删除、查找等)都必须通过一个锁(synchronized)来保证线程安全。这种方式使得Hashtable
在多线程环境下效率较低,因为无论是读取还是写入操作都需要获得锁,无法做到并发访问。ConcurrentHashMap
:在 Java 8 中,ConcurrentHashMap
采用了CAS + synchronized
的方式进行线程安全控制。CAS 用于无锁的写入操作。如果某个 Node 节点为空,则通过 CAS 将数据插入节点。如果不为空,则会退化到 synchronized。使用 synchronized 锁定冲突节点的头结点。这种锁的粒度更细,仅锁住特定的冲突节点,而非整个表,因此在并发访问时性能较好。高的并发性能。
7,HashMap 的默认初始容量和扩容阈值是什么?
- 451 Java 中 HashMap 的扩容机制是怎样的?
- 453 为什么 Java 中 HashMap 的默认负载因子是 0.75?
8,数据库四种隔离性的特点是什么?
- 606 MySQL 中的事务隔离级别有哪些?
9,如何进行慢 SQL 治理?
- 631 如何在 MySQL 中监控和优化慢 SQL?
- 616 MySQL 中如何进行 SQL 调优?
10,在哪些地方使用过消息队列?
- 1085 什么是消息队列?
- 1087 为什么需要消息队列?
11,介绍一下 Cookie、Session 和 Token 的区别?
- 698 Cookie、Session、Token 之间有什么区别?
12,MyBatis 的两级缓存及其特点是什么?
- 1153 说说 MyBatis 的缓存机制?
13,MyBatis 在什么情况下会有 SQL 注入风险?
- 1084 MyBatis 中 #{} 和 ${} 的区别是什么?
14,你了解反序列化漏洞吗?
在反序列化过程中,程序未对输入数据进行严格的验证,恶意用户可能发送伪造的序列化数据,利用程序漏洞执行任意代码或操作。
简单来说就是在反序列化中的数据夹带私货,让程序执行一些危险操作。
16,你了解哪些本地缓存组件?
- Ehcache:可以作为本地缓存,也支持集群化和分布式部署
- Guava Cache:Google 提供,它是一个轻量级的内存缓存解决方案,适用于小规模的缓存应用
- Caffeine:是 Guava Cache 的一个升级版,具有更高的性能和更丰富的缓存管理功能
后端实习一面
简单介绍一下 Redis,你在这个项目里怎么用它的?
Redis 通常应用于缓存、实时系统、消息队列、分布式锁、计数器等场景。
使用举例:基于内存的高性能键值对存储,在项目中负责分布式 Session 存储、限流功能的实现。
数据存在 MySQL 再查找不是也很快吗?
- 635 Redis 为什么这么快?
Redis 常用数据结构有哪些?
- 637 Redis 中常见的数据类型有哪些?
HTTP和HTTPS的区别是什么?
- 672 HTTP 和 HTTPS 有什么区别?
equals和==的区别是什么?可以用equals对比两个对象吗?
- 100 Java 中 hashCode 和 equals 方法是什么?它们与 == 操作符有什么区别?
ArrayList和LinkedList的区别是什么?
- 9180 Java 中 ArrayList 和 LinkedList 有什么区别?
请解释TCP三次握手的过程。
- 677 说说 TCP 的三次握手?
MySQL默认引擎是什么?为什么选择它?
- 590 MySQL 的存储引擎有哪些?它们之间有什么区别?
@Component和@Service的区别是什么?
- 766 @Component、@Controller、@Repository和@Service 的区别?
MQ你了解吗?
- 1085 什么是消息队列?
- 1087 为什么需要消息队列?
更多大厂真实面经,春招热门面试题,Java、C++、python、Go、运维、测试、大数据 ……等更多面试题目和详细解析尽在*****
#京东求职进展汇总#