25年11月太极 Java开发 一面
#JAVA##JAVA面经##JAVA内推#
1. 请做一个自我介绍
思路
- 核心逻辑:基本信息(学校/工作年限)→ 核心技术栈(贴合Java开发)→ 项目亮点(判题相关、JWT、Docker等)→ 求职意向(匹配岗位需求)。
- 重点:突出与面试岗位相关的技术储备和项目经验,控制在1-2分钟,简洁有重点。
回答示例
面试官您好,我是XXX,XX大学计算机专业在读/有X年Java开发经验。熟练掌握Java基础、SpringBoot、MySQL、Docker等技术,熟悉JWT认证、代码沙箱实现、动态规划等知识点。曾参与OJ判题类项目开发,负责核心判题模块的设计与实现,包括基于Docker的代码沙箱搭建、JWT接口认证等核心功能,具备独立开发和问题排查能力。我对Java后端开发有浓厚兴趣,希望能加入团队,发挥自己的技术优势完成相关开发工作。
2. 介绍项目中与判题相关的技术亮点(重点提及JWT,并围绕JWT追问)
思路
- 判题核心技术:代码沙箱(Docker隔离)、用例比对、超时/内存限制、JWT接口认证。
- JWT亮点:无状态认证、减轻服务器压力、适配判题接口的鉴权需求、token有效期控制。
- 逻辑:先讲判题整体流程,再聚焦技术亮点,说明技术选型的原因和落地效果。
回答示例
我参与的OJ判题项目中,核心技术亮点主要有两方面:一是判题核心模块,基于Docker搭建代码沙箱,实现用户代码的隔离执行,限制CPU、内存和运行时间,避免恶意代码攻击;二是接口认证层面,采用JWT实现无状态鉴权,用户登录后生成包含用户信息和有效期的token,后续判题接口通过解析token完成鉴权,无需存储会话信息,减轻了服务器压力,也适配了分布式部署的需求。
3. JWT是无状态的,为什么不使用Session(持续追问)
思路
- 先对比JWT和Session的核心差异:Session有状态(服务器存储会话)、JWT无状态(token存储客户端)。
- 不选Session的原因:分布式场景下Session共享复杂(需Redis/数据库同步)、服务器存储会话占用内存、跨域/多端适配差;JWT无需服务端存储、跨端兼容好、拓展性强。
- 补充:JWT的不足(无法主动失效)及解决方案,体现思考全面性。
回答示例
选择JWT而非Session,核心是适配判题项目的分布式部署场景: 第一,Session是有状态的,会话信息存储在服务器内存/容器中,若部署多台应用服务器,需额外做Session共享(如Redis同步),增加架构复杂度;而JWT的token存储在客户端,服务端只需解析验证,无需存储,天然适配分布式。 第二,判题项目有大量用户并发提交代码,Session会占用服务器大量内存,而JWT无状态的特性能大幅降低服务端存储压力。 第三,JWT支持跨域、多端(Web/APP)认证,而Session依赖Cookie,跨域适配成本高。 当然JWT也有不足,比如token生成后无法主动失效,我在项目中通过设置短有效期+刷新token机制解决,平衡了安全性和易用性。
4. 介绍docker代码沙箱的实现流程
思路
- 核心流程:用户提交代码→服务端接收并封装→创建Docker容器(配置资源限制)→容器内编译/运行代码→捕获运行结果(输出/错误/超时)→销毁容器→返回结果。
- 关键细节:资源限制(CPU/内存/时间)、镜像选择(轻量基础镜像)、隔离性(容器独立命名空间)、安全控制(禁止网络访问)。
回答示例
Docker代码沙箱的核心是通过容器实现用户代码的隔离、安全执行,流程如下:
- 用户提交代码和题目信息后,服务端先对代码做基础校验(如禁止危险关键字);
- 服务端将用户代码、测试用例封装成可执行脚本,指定轻量基础镜像(如Alpine)创建Docker容器,并配置资源限制:CPU核心数、内存上限(如512M)、运行超时时间(如3秒),同时禁止容器访问网络;
- 启动容器,在容器内编译(如Java代码用javac)并运行代码,执行测试用例;
- 实时捕获容器的运行结果:包括程序输出、错误信息、是否超时/内存溢出;
- 运行结束后立即销毁容器,释放资源,避免占用服务器资源;
- 服务端整理运行结果(如比对输出与标准答案),返回判题结果给用户。 整个过程通过Docker的隔离性保证用户代码不会影响主机和其他容器,资源限制避免了恶意代码耗尽服务器资源。
5. 说说你对多态的理解
思路
- 定义:同一行为在不同对象上有不同表现形式,核心是“父类引用指向子类对象”。
- 实现条件:继承/实现接口、方法重写、父类引用指向子类对象。
- 分类:编译时多态(方法重载)、运行时多态(方法重写)。
- 作用:降低耦合、提高代码拓展性,举例说明(如父类Animal,子类Cat/Dog重写eat方法)。
回答示例
多态是Java面向对象的核心特性之一,核心是“同一接口,不同实现”,即父类/接口的引用可以指向子类/实现类的对象,调用方法时会执行子类的实现。 实现多态需满足三个条件:一是要有继承或接口实现关系;二是子类要重写父类/接口的方法;三是父类引用指向子类对象。 多态分为编译时多态(方法重载,根据参数列表区分)和运行时多态(方法重写,运行时确定执行子类方法)。比如定义Animal父类,Cat和Dog子类重写eat()方法,通过Animal animal = new Cat()调用eat(),实际执行Cat的eat(),这就是运行时多态。多态能大幅降低代码耦合,比如新增Bird子类时,无需修改原有调用逻辑,只需重写eat(),提升了代码拓展性。
6. Java中常见的集合类有哪些?分别有什么特点
思路
- 分类:Collection(List/Set/Queue)、Map(HashMap/TreeMap/ConcurrentHashMap)。
- 核心特点:List有序可重复(ArrayList/LinkedList)、Set无序不可重复(HashSet/TreeSet)、Map键值对(HashMap非线程安全,ConcurrentHashMap线程安全)。
- 补充:底层结构(ArrayList数组、LinkedList链表、HashMap数组+链表+红黑树)。
回答示例
Java集合主要分为Collection和Map两大体系:
- Collection接口:
- List:有序、可重复,核心实现类有ArrayList(底层数组,查询快、增删慢)、LinkedLi
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏
