25年11月它思科技 Java开发 一面

#JAVA##JAVA面经##JAVA内推#

1. 你的项目使用了什么架构?包含哪些模块?你负责的模块是否使用数据库?用了哪种数据库?具体如何使用的?

思路

  • 架构:明确说出架构类型(如SpringBoot分层架构、微服务架构),核心设计思路(高内聚低耦合)。
  • 模块:按业务划分(如用户模块、订单模块、支付模块),清晰说明模块职责。
  • 数据库:明确是否使用+数据库类型(MySQL/Redis等)+具体使用场景(表设计、增删改查、索引优化、事务处理)。
  • 重点:结合负责模块,体现数据库使用的实操性,而非仅说“用了MySQL”。

回答示例
我负责的项目采用SpringBoot分层架构(Controller+Service+Mapper),整体分为用户模块、订单模块、商品模块和支付模块。我主要负责订单模块开发,这个模块用到了MySQL数据库。具体使用上:一是设计了订单表、订单详情表,用主键索引+联合索引(订单号+用户ID)优化查询;二是核心业务(如创建订单)用了事务保证原子性,避免订单创建成功但库存未扣减的问题;三是高频查询的订单列表做了分页+索引优化,减少全表扫描,同时用MyBatis实现SQL的CRUD操作,降低耦合。

2. 了解Linux常用命令吗?

思路

  • 分类列举核心命令:文件操作(ls/cd/cp/rm)、进程查看(ps/top)、日志查看(tail/cat/grep)、文件编辑(vim)、权限管理(chmod)、网络查看(netstat/ss)。
  • 结合开发场景:说明命令的实际用途(如tail -f看实时日志,ps -ef | grep java查Java进程)。

回答示例

了解常用的Linux命令,日常开发和部署会高频使用:比如文件操作用ls(查看目录)、cd(切换目录)、cp(复制文件);查看进程用ps -ef | grep java(查Java进程)、top(实时监控系统资源);查看日志用tail -f xxx.log(实时看应用日志)、grep 'error' xxx.log(筛选错误日志);编辑文件用vim,修改文件权限用chmod,查看端口占用用netstat -tlnp | grep 8080,这些命令能高效完成项目部署和问题排查。

3. 是否部署过项目?具体怎么部署的?

思路

  • 明确回答“是”,说明部署方式(如手动部署/脚本部署),按步骤梳理流程。
  • 核心步骤:打包(mvn package)→ 上传服务器(scp)→ 停止旧服务 → 启动新服务(java -jar)→ 查看日志验证。
  • 补充细节:如配置JVM参数、后台运行(nohup)、端口占用处理,体现实操性。

回答示例

我部署过基于SpringBoot的Java项目,主要用手动部署的方式,步骤如下:第一步,在本地用mvn package打包成jar包;第二步,通过scp命令把jar包上传到Linux服务器指定目录;第三步,用ps -ef | grep java找到旧进程并kill掉;第四步,用nohup java -jar -Xms512m -Xmx1024m xxx.jar > log.out 2>&1 & 启动项目(配置JVM参数+后台运行);最后用tail -f log.out查看启动日志,验证项目是否正常访问,同时检查端口是否被占用,确保部署成功。

4. 了解Spring AOP的原理吗?哪些场景下AOP注解会失效?

思路

  • AOP原理:基于动态代理(JDK动态代理:接口+实现类;CGLIB动态代理:无接口,继承目标类);核心流程:定义切点→增强处理→织入(编译期/类加载期/运行期,Spring是运行期织入)。
  • 注解失效场景:内部方法调用(未走代理)、private/final方法(无法被代理)、目标类未被Spring管理、代理对象被覆盖/手动new实例。

回答示例

Spring AOP核心是动态代理:如果目标类实现了接口,用JDK动态代理(生成实现接口的代理类);如果没有实现接口,用CGLIB动态代理(生成目标类的子类),运行期将增强逻辑织入目标方法。 AOP注解失效的常见场景:第一,目标类的方法是private或final修饰,无法被代理(CGLIB无法继承final类,JDK代理也无法处理private方法);第二,类内部方法调用(比如A方法调用本类的B方法,B加了AOP注解,此时调用不走代理,注解失效);第三,目标类没有被Spring容器管理(如手动new实例,而非@Autowired注入);第四,代理对象被覆盖(如多次初始化导致代理失效)。

5. 编写SQL语句:查询每个user的name,以及每个user对应的account数量

思路

  • 核心逻辑:关联查询(左连接,保证无account的user也显示)+ 分组统计(COUNT)。
  • 表关联:user.id = account.user_id,用LEFT JOIN避免丢失无账号的用户;COUNT(account.id) 而非COUNT(*),避免统计NULL值。
  • 语法:SELECT 字段 + FROM 主表 + LEFT JOIN 关联表 + ON 条件 + GROUP BY 分组字段。

回答示例

对应的SQL语句如下:

SELECT u.name AS user_name, COUNT(a.id) AS account_count
FROM user u
LEFT JOIN account a ON u.id = a.user_id
GROUP BY u.id, u.name;

解释:用LEFT JOIN关联user和account表,保证即使某个用户没有账号(account无对应记录)也会被查询到,COUNT(a.id)统计每个用户的账号数量(a.id为NULL时COUNT结果为0);按user的id和name分组,确保每个用户的信息唯一,最终返回用户名和对应的账号数量。

#JAVA##面经##面试#
全部评论

相关推荐

03-11 20:19
已编辑
门头沟学院 Java
太压力了,面了2个多小时,本菜比已经被拷打的瑟瑟发抖面完两个小时后通知过了1.算法题三道(1)leetcode124 二叉树中最大路径和hard题 因为不久前才刷过撕出来了,又来了一道(2)leetcode 300 最长递增子序列变种除了递增之外还加了一个权重因素,但是思路没变,dp就行(3)寻找词汇库里符合固定长度前缀的匹配单词应该是他们自己题库的题。给了一串单词列表,然后又给了一个单词,一个下标,根据这个下标的前缀去单词列表里面找到所有匹配的单词再返回思路是创建一个单词前缀树,然后根据树找,但是可能是构件树数有问题没撕出来2.全方位项目拷打基本没有问八股,全部都是项目企业场景题,哎哟我操,完全不会。我就纯八股战士,结果没想到一道八股都没问反正尽可能把企业场景往八股上引吧。。1. 微服务多点部署其中一个宕机了怎么办2. 要是mq占据大量CPU该怎么排查?MySQL占据大量CPU该怎么排查?3. 假如说让你实现视频点赞功能,你打算怎么设计?讲讲思路(我知道多级缓存,但是碰巧没背……寄)4. Redis延迟双删是什么,分布式锁,哨兵模式5. MySQL到es同步的延迟该怎么优化6. Rabbit mq的队列是怎么实现的?(这个完全没整明白,可能是队列的底层结构? 反正我硬扯的讲了一下rabbit mq的架构)还扯了很多,但是往后完全就慌了),记住的是这些
不知道怎么取名字_:2小时确实有压力,持续性的脑力劳动啊
查看9道真题和解析
点赞 评论 收藏
分享
03-03 19:02
已编辑
东华理工大学 Node.js
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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