25年9月东华软件 Java开发实习生线上一面
#JAVA##JAVA面经##JAVA内推#
前端这块你平时有接触吗?了解多少?
“有系统接触:掌握HTML5/CSS3/ES6基础,能独立开发响应式页面;深入使用Vue2(含Vue Router、Vuex),了解React核心思想(组件化、Hooks)。日常通过MDN、Vue官方文档学习,关注前端工程化(Webpack/Vite)。虽主攻后端,但坚持‘懂前端才能设计好API’——例如理解Axios拦截器原理后,后端统一返回
{code, data, msg}格式,大幅减少联调摩擦。近期正用Vue3+TypeScript重构个人博客,深化全栈协作认知。”
你项目里的前端页面是自己写的吗?用的什么技术?
“是的,校园二手平台前端由我独立开发:
- 技术栈:Vue 2.6 + Element UI + Axios + Vue Router
- 关键实现:
• 封装request.js:统一添加Token、处理401跳转登录
• 路由守卫:根据用户角色动态生成侧边栏菜单(管理员可见‘审核中心’)
• 性能优化:商品图片懒加载、搜索防抖(300ms)- 协作细节:用Swagger定义接口规范,联调前用Postman验证字段,避免‘前端等后端’。虽非专业前端,但这段经历让我深刻理解:后端开发者懂前端,是高效协作的隐形加速器。”
Linux用过吗?开发或部署时常用的命令能随手说几个吗?
“日常使用WSL2开发,项目部署在CentOS云服务器,高频命令分四类:
🔹 日志排查:tail -f app.log | grep "ERROR"(实时追踪错误)、less +F app.log(大文件查看)
🔹 进程管理:ps -ef | grep java(查进程)、kill -9 PID(强制终止)、top(监控CPU/内存)
🔹 文件操作:scp local.jar user@server:/opt(上传文件)、find / -name "*.log" -mtime -1(查24小时内日志)
🔹 网络诊断:netstat -tunlp | grep 8080(查端口占用)、curl http://localhost:8080/health(服务自检)
实战案例:曾通过journalctl -u app.service --since "5 minutes ago"快速定位服务启动失败原因(配置文件路径错误)。”
聊聊你项目里的权限控制流程
“采用 JWT + 拦截器 + 前端路由守卫 三层控制:
1️⃣ 登录认证:用户提交账号密码 → 后端校验 → 生成JWT(含userId、role、exp) → 返回前端存localStorage
2️⃣ 请求校验:
- 前端:Axios拦截器自动在Header加
Authorization: Bearer {token}- 后端:自定义拦截器解析JWT → 验签/过期检查 → 将用户信息存ThreadLocal(避免重复解析)
3️⃣ 权限判定:- 接口层:
@PreAuthorize("hasRole('ADMIN')")注解控制(基于Spring Security)- 前端:路由守卫根据
user.role动态渲染菜单(如普通用户不显示‘商品审核’入口)
安全加固:Token设置短有效期(2h)+ Redis存黑名单(应对强制下线),敏感操作加短信二次验证。”
面向对象三大特性,结合代码经历谈理解
“封装:不是‘藏起来’,而是‘定义清晰边界’。
→ 例:Order实体中,setStatus()方法校验状态流转合法性(如‘已发货’不能回退‘待支付’),外部无法直接改status字段,避免业务逻辑散落。
继承:为复用而生,但慎用‘为继承而设计’。
→ 例:BaseResponse封装code/msg/data,所有Controller返回继承它;但业务类避免深层继承,改用组合(如订单含User对象而非继承User)。
多态:让系统拥有‘生长能力’。
→ 例:支付模块中,PaymentContext持PaymentStrategy接口,运行时注入AlipayStrategy/WechatStrategy。新增银联支付?只需实现接口,零修改核心逻辑。
核心感悟:OOP本质是用代码表达业务语言,让修改成本最低、扩展成本趋近于零。”
分页查询一般怎么实现?后端要处理哪些事?
“标准流程四步:
1️⃣ 参数校验:pageNum≥1,pageSize合理范围(如1-100)
2️⃣ 计算偏移量:offset = (pageNum - 1) * pageSize
3️⃣ 数据库查询:
- 主查询:
SELECT ... LIMIT offset, pageSize- 总数查询:
SELECT COUNT(*) ...(注意:避免SELECT *查总数)
4️⃣ 封装返回:{ "list": [...], "total": 150, "pageNum": 2, "pageSize": 10, "totalPages": 15 }避坑点:
⚠️ 深度分页优化:pageNum过大时改用游标分页(如WHERE id > lastId LIMIT 10)
⚠️ 总数缓存:高频查询场景,用Redis缓存COUNT结果(设置短TTL)”
你项目里分页具体咋做的?
“基于 MyBatis-Plus 分页插件 实现:
- 前端传参:
pageNum=2, pageSize=10(Element UI分页组件自动传递)- 后端处理:
Page<Product> page = new Page<>(pageNum, pageSize); IPage<Product> result = productMapper.selectPage(page, queryWrapper); // 返回IPage对象(含records, total, current等)- 返回结构:
{ "records": [...], "total": 85, "size": 10, "current": 2, "pages": 9 }优化细节:
• 查询条件含用户ID(防越权:queryWrapper.eq("user_id", getCurrentUserId()))
• 前端根据total动态显示‘共85条’,提升用户体验
• 压测验证:10万数据量下,分页查询稳定在50ms内”
SpringBoot和传统Spring有啥不一样?为啥爱用它?
“核心差异在 ‘约定优于配置’ :
维度 传统Spring SpringBoot 配置 大量XML(web.xml, applicationContext.xml) 注解驱动(@SpringBootApplication) 依赖 手动管理版本冲突 Starter自动导入(如spring-boot-starter-web) 部署 打war包+外置Tomcat 内嵌Tomcat, java -jar直接运行监控 需额外集成 Actuator开箱即用(/actuator/health)
为何流行:
✅ 开发效率:5分钟搭建REST API(对比传统Spring需配置DispatcherServlet等)
✅ 微服务友好:独立进程、健康检查、外部化配置(application.yml)
✅ 生态整合:无缝对接Spring Cloud、MyBatis-Plus等
个人体验:项目中用@ConfigurationProperties绑定配置,修改数据库密码只需改yml,无需重编译——这种‘小确幸’极大提升幸福感。”
Java集合用得多吗?ArrayList和LinkedList有啥区别?平时怎么选?
“高频使用,选择原则:看访问模式+数据规模
特性 ArrayList LinkedList 底层 动态数组 双向链表 随机访问 O(1) ✅ O(n) ❌ 首尾插入 O(n)(需扩容) O(1) ✅ 内存占用 小(仅数组) 大(节点含prev/next指针) 缓存友好 高(连续内存) 低(指针跳转)
选型指南:
🔹 90%场景选ArrayList:查询多、数据量中等(<1万),缓存局部性带来实际性能优势
🔹 仅当频繁在首尾增删+极少随机访问时选LinkedList(如实现LRU缓存队列)
🔹 线程安全需求:CopyOnWriteArrayList(读多写少)或Collections.synchronizedList”
你项目里哪些地方用了ArrayList?为啥选它?
“两处典型应用:
1️⃣ 商品列表查询:List<Product> products = productMapper.selectList(wrapper); // MyBatis返回ArrayList选型理由:前端需按索引渲染(如第3个商品高亮),ArrayList随机访问O(1);数据量<5000,扩容成本低。
2️⃣ 导出Excel数据组装:List<List<Object>> excelData = new ArrayList<>(); // 外层存行,内层存单元格选型理由:顺序遍历写入文件,ArrayList连续内存减少GC;对比LinkedList,实测1万行数据导出快15%。
反思:曾误用LinkedList存配置项(需频繁get(index)),压测发现耗时翻倍,后改为ArrayList——理论需经实战验证。”
项目最后是怎么部署上线的?自己操作过吗?
#java##JAVA##面经#“全流程自主操作(阿里云ECS + CentOS 7):
1️⃣ 打包:Maven执行clean package -DskipTests,生成campus-trade.jar
2️⃣ 上传:scp campus-trade.jar root@server:/opt/app/
3️⃣ 部署脚本(start.sh):nohup java -Xms512m -Xmx1024m -jar campus-trade.jar \ --spring.profiles.active=prod > app.log 2>&1 &4️⃣ 服务管理:用systemctl注册为系统服务(支持
systemctl start app)
5️⃣ 前端部署:npm run build生成dist → Nginx托管(配置反向代理后端)
6️⃣ 验证:curl http://localhost:8080/actuator/health+ 浏览器访问
运维意识:
• 日志轮转:logrotate配置每日切割
• 监控:部署后用top观察内存,设置企业微信告警(CPU>80%触发)
• 未来规划:正学习Docker,计划用Dockerfile容器化部署,提升环境一致性。”
本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏