2025 年最全 Java 面试题,京东后端面试面经合集,答案汇总

最近京东搞了个 TGT 计划,针对顶尖青年技术天才,直接宣布不设薪资上限。TGT 计划面向范围包括 2023 年 10 月 1 日到 2026 年 9 月 30 日毕业的海内外本硕博毕业生。时间范围还挺宽松的,有想法的同学可以试一试。 alt

京东这两年一直在高薪招人,去年东哥给的年终也很吸引人。零售部门 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)使用 CallableFutureTask

  • 实现 Callable 接口的 call() 方法,使用 FutureTask 包装 Callable 对象,再通过 Thread 启动。
  • 例子:FutureTask<Integer> task = new FutureTask<>(new MyCallable()); Thread thread = new Thread(task); thread.start();

4)使用线程池(ExecutorService

  • 通过 ExecutorService 提交 RunnableCallable 任务,不直接创建和管理线程,适合管理大量并发任务。
  • 例子:ExecutorService executor = Executors.newFixedThreadPool(10); executor.submit(new MyRunnable());

5)CompletableFuture(本质也是线程池,默认 forkjoinpool)

  • Java 8 引入的功能,非常方便地进行异步任务调用,且通过 thenApplythenAccept 等方法可以轻松处理异步任务之间的依赖关系。
  • 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 有几个级缓存?

  1. 浏览器缓存(TTL 通常几分钟到几小时)
  2. 操作系统缓存(Windows/Linux/macOS 维护的本地 DNS 缓存)
  3. 路由器缓存(家庭或企业路由器可能缓存 DNS 结果)
  4. 本地 ISP DNS 服务器缓存(ISP 提供的 DNS 服务器缓存大量常用域名)
  5. 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 中常用的线程安全的哈希表实现,它们主要在性能有显著的差异。

因为在线程安全性上的实现方式不同,导致了它们性能上的差别

  • HashtableHashtable 使用的是单一的锁机制(全表锁),即对整个哈希表进行同步,所有的操作(如插入、删除、查找等)都必须通过一个锁(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,你了解哪些本地缓存组件?

  1. Ehcache:可以作为本地缓存,也支持集群化和分布式部署
  2. Guava Cache:Google 提供,它是一个轻量级的内存缓存解决方案,适用于小规模的缓存应用
  3. 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、运维、测试、大数据 ……等更多面试题目和详细解析尽在*****

#京东求职进展汇总#
全部评论
求面经啊
点赞 回复 分享
发布于 06-18 17:43 福建
mark
点赞 回复 分享
发布于 06-02 22:16 山东

相关推荐

10-15 21:40
浙江大学 Java
前言:在讨论区里,每天都有无数“许愿OC”、“还愿字节”的帖子。Java,作为经久不衰的“内卷之王”,其就业市场早已从“会写SSH就能找到工作”变成了“源码、高并发、项目亮点一个不能少”。本文将为你拆解Java求职的真相与破局之道。一、&nbsp;市场现状:冰与火之歌当前的Java就业市场,是一场典型的&nbsp;“结构型失衡”:“火”的一面:高端人才缺口巨大。大厂对Java工程师的要求水涨船高。牛客网上的SP(Special&nbsp;Offer)&nbsp;和&nbsp;SSP(Super&nbsp;Special&nbsp;Offer)&nbsp;面经显示,手握多个大厂Offer的候选人,无一不是对JVM、并发编程、分布式系统有深刻理解的。中小厂业务求生欲强,希望招来的人能立即上手,解决高并发、分布式事务、系统重构等实际问题。“冰”的一面:初级开发者严重过剩。“简历模板化”:牛客网简历库中,充斥着“仿美团”、“仿商城”的同质化项目。“面试八股文化”:候选人能倒背&nbsp;HashMap&nbsp;源码,但被问到“为什么你的QPS只能到100?”时却哑口无言。一个有趣的现象是,“讨论区”的焦虑感远高于&nbsp;“面经区”。面经区里成功上岸的分享,往往都指向一个共同点:深度&nbsp;+&nbsp;亮点。二、&nbsp;技能图谱:从“八股文”到“价值输出”想在“海笔”、“海面”中脱颖而出,你的技能树必须点得又深又广。1.&nbsp;基础内功(面试入场券)“Java面试宝典”题库的核心,是你不挂在一面的保障。JVM:不止是垃圾回收器,更要懂内存模型、类加载机制、线上OOM问题排查与优化。能说出怎么用&nbsp;jstack、jmap分析线上问题。并发编程:synchronized&nbsp;与&nbsp;AQS&nbsp;的原理、ConcurrentHashMap的演进、线程池参数设置与调优。建议:一定要在本地代码跑出死锁,并用工具排查。集合框架:HashMap是必考题,但要延伸到&nbsp;ConcurrentHashMap&nbsp;如何保证线程安全、CopyOnWriteArrayList&nbsp;的应用场景。2.&nbsp;框架生态(工程能力体现)Spring:别再停留在配置和使用。高频问题包括:Spring&nbsp;Bean的生命周期、循环依赖的解决原理(三级缓存)。Spring事务的传播机制,以及在分布式场景下的局限性。Spring&nbsp;Boot的自动装配原理,如何自定义一个Starter。ORM:MyBatis的缓存机制、#{}和${}的区别及SQL注入风险。微服务:这是价值加分项。Spring&nbsp;Cloud&nbsp;Alibaba生态(Nacos,&nbsp;Sentinel,&nbsp;Seata)已成为主流,需要了解其原理,最好在项目中有实践。3.&nbsp;分布式与中间件(大厂敲门砖)这是区分“CRUD仔”和“高级工程师”的关键。缓存:Redis的数据结构、持久化、哨兵/集群模式、缓存穿透/雪崩/击穿解决方案。消息队列:Kafka的高吞吐原理、RocketMQ的事务消息、如何保证消息不丢失、顺序消息。数据库:MySQL的索引优化、SQL调优、分库分表策略。经典问题:“一条SQL语句在MySQL中是如何执行的?”4.&nbsp;项目经验(从“有”到“优”)你的项目是“玩具”还是“产品”,面试官一问便知。量化你的成果:不要说“我优化了系统”,要说“通过索引优化和缓存,将订单查询接口的RT从500ms降低到了50ms,QPS从100提升到2000”。深挖项目难点:准备好1-2个你项目中最复杂的技术难点,讲清楚背景、你的思考、技术选型、落地过程和最终结果。这在二面、三面中是必问环节。三、&nbsp;求职实战:面经的正确打开方式1.&nbsp;&nbsp;刷题不是目的,思路才是:牛客的“题库”&nbsp;的剑指Offer、LeetCode热题是必刷的。但重点不是背答案,而是形成解题思路,并在代码注释中写下你的思考过程(模拟面试场景)。2.&nbsp;&nbsp;看面经,不如“复盘”面经:不要只看别人问了什么。尝试自己回答,然后对比大佬分享的“标准答案”,找到自己的知识盲区。把高频问题整理成自己的&nbsp;“八股文”笔记。3.&nbsp;&nbsp;参与模拟面试:牛客网的“面试实战”&nbsp;功能是很好的练兵场。找不认识的同学互相面试,能极大缓解真实面试的紧张感,并暴露你表达上的问题。四、&nbsp;职业规划与Offer选择请从以下几个维度考虑:技术成长:团队的技术氛围、是否有大牛带、业务的技术挑战性。业务发展:业务是否处于上升期,这决定了你的发展空间和晋升速度。Work-Life&nbsp;Balance:问问自己,你现阶段更想要什么?“人的职业生涯是马拉松,第一份工作或某一次跳槽的起跑速度固然重要,但持续学习和迭代的能力,才是决定你能跑多远的关键。”结语Java的战场从未消失,只是门槛越来越高。在这个“求职广场”上,我们看到了最真实的竞争、最无私的分享和最坚定的努力。给每一位Java求职者的最后建议:放下焦虑,停止空想,立刻行动。从今天起,深度研究一个开源项目的源码,用压测工具去优化你项目中的一个接口,记录下你的每一次面试复盘。当你把“被动应付面试”变为“主动构建知识体系”时,你会发现,那些曾经梦寐以求的Offer,自然会水到渠成。本文章纯个人观点,旨在提供情绪价值。祝各位牛友,前程似锦,offer多多!
发面经攒人品
点赞 评论 收藏
分享
评论
10
42
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务