27届温州小厂Java后端实习一面复盘:快排、大数相加、链表判环 + Spring核心原理全解析
面试时长:约40分钟
岗位方向:Java 后端开发实习生(温州本地企业)
关键词:快速排序、大数相加、链表判环、SQL TOP N、ArrayList vs LinkedList、Spring AOP/IOC、Bean 生命周期、Redis 数据类型、项目介绍
作为一名27届在校生,我在近期参加了一家温州本地企业的 Java 后端实习面试。虽然公司规模不大,但面试内容却非常扎实——既考察基础编码能力(三道算法题),又深入 Spring 核心机制与常用中间件原理,充分体现了“小厂重基础、重动手”的特点。
本文将以真实模拟对话 + 专业解析的形式,完整还原这场面试,并提供高质量回答思路,特别适合准备中小型公司实习面试的同学参考!
一、算法三连击:快排、大数相加、链表判环
面试官提问:
“手写一个快速排序。”
我的回答:
“好的,我用递归 + 双指针分区的方式实现:
publicvoidquickSort(int[]arr,intleft,intright){if(left>=right)return;intpivotIndex=partition(arr,left,right);quickSort(arr,left,pivotIndex-1);quickSort(arr,pivotIndex+1,right);}privateintpartition(int[]arr,intleft,intright){intpivot=arr[right];// 选最右为基准inti=left;for(intj=left;j<right;j++){if(arr[j]<=pivot){swap(arr,i++,j);}}swap(arr,i,right);// 将 pivot 放到正确位置returni;}privatevoidswap(int[]arr,inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}时间复杂度:平均 O(n log n),最坏 O(n²)(已有序时);
空间复杂度:O(log n)(递归栈)。
💡优化点:可随机选择 pivot 或三数取中,避免最坏情况。
面试官追问:
“两个超大整数(超出 long 范围)相加,怎么实现?”
我的回答:
“用字符串模拟竖式加法,从低位到高位逐位相加,处理进位:
publicStringaddStrings(Stringnum1,Stringnum2){StringBuilderres=newStringBuilder();inti=num1.length()-1,j=num2.length()-1;intcarry=0;while(i>=0||j>=0||carry>0){intx=i>=0?num1.charAt(i--)-'0':0;inty=j>=0?num2.charAt(j--)-'0':0;intsum=x+y+carry;res.append(sum%10);carry=sum/10;}returnres.reverse().toString();}关键点:
- 从字符串末尾开始遍历;
- 用
carry记录进位; - 最后反转结果。
✅适用场景:金融系统、高精度计算。
面试官再问:
“如何判断链表是否有环?”
我的回答:
“经典解法是快慢指针(Floyd 判圈算法):
publicbooleanhasCycle(ListNodehead){if(head==null||head.next==null)returnfalse;ListNodeslow=head,fast=head;while(fast!=null&&fast.next!=null){slow=slow.next;fast=fast.next.next;if(slow==fast)returntrue;// 相遇即有环}returnfalse;}原理:
- 快指针每次走 2 步,慢指针走 1 步;
- 若有环,快指针必在环内追上慢指针;
- 时间复杂度 O(n),空间 O(1)。
🔁扩展:相遇后可进一步求环入口(让一个指针回到头,同步走)。
二、SQL 实战:查成绩最高的前三个学生
面试官提问:
“有一张 student 表(id, name, score),查询成绩最高的前三个学生。”
我的回答:
“使用ORDER BY + LIMIT即可:
SELECTid,name,scoreFROMstudentORDERBYscoreDESCLIMIT3;注意点:
- 如果有并列分数(如第3名有两人),可能需要
RANK()或DENSE_RANK(); - 但在大多数业务场景中,
LIMIT 3已满足需求。
📌MySQL 特有语法:其他数据库用
TOP 3(SQL Server)或FETCH FIRST 3 ROWS ONLY(Oracle)。
三、集合框架:ArrayList vs LinkedList
面试官提问:
“ArrayList 和 LinkedList 有什么区别?”
我的回答:
| 维度 | ArrayList | LinkedList |
|---|---|---|
| 底层结构 | 动态数组 | 双向链表 |
| 随机访问 | O(1)(支持下标) | O(n)(需遍历) |
| 插入/删除 | O(n)(需移动元素) | O(1)(已知节点时) |
| 内存占用 | 少(仅数组) | 多(每个节点存 prev/next 指针) |
| 线程安全 | 否(可用Collections.synchronizedList) | 否 |
使用建议:
- 频繁查询 → 选
ArrayList; - 频繁首尾增删 → 选
LinkedList(但实际很少用,因缓存局部性差)。
⚠️误区:很多人以为 LinkedList 插入快,但若需先
get(index)再插入,总复杂度仍是 O(n)。
四、Spring 核心:AOP、IOC 与 Bean 生命周期
面试官提问:
“说说 AOP 和 IOC 是什么?”
我的回答:
IOC(Inversion of Control,控制反转):
把对象的创建和依赖管理交给 Spring 容器,而不是程序员手动new。通过@Component、@Service等注解声明 Bean,容器自动注入依赖(DI)。AOP(Aspect-Oriented Programming,面向切面编程):
在不修改源码的情况下,统一处理横切逻辑(如日志、事务、权限)。Spring AOP 基于动态代理(JDK Proxy 或 CGLIB)实现。
✅关系:IOC 是 AOP 的基础——只有 Bean 被 Spring 管理,才能被代理。
面试官追问:
“什么是 Spring Bean?它的生命周期是怎样的?”
我的回答:
Spring Bean是由 Spring 容器管理的对象,通过配置或注解定义。
Bean 生命周期(简化版):
- 实例化:调用构造器或工厂方法;
- 属性赋值:通过 setter 或字段注入依赖;
- Aware 接口回调:如
BeanNameAware、ApplicationContextAware; - BeanPostProcessor 前置处理:
postProcessBeforeInitialization; - 初始化方法:
@PostConstruct或init-method; - BeanPostProcessor 后置处理:
postProcessAfterInitialization; - 就绪使用;
- 销毁:容器关闭时调用
@PreDestroy或destroy-method。
🔄图示记忆:实例化 → 注入 → 初始化 → 使用 → 销毁。
五、Redis 基础:五大数据类型
面试官提问:
“Redis 常见数据类型有哪些?”
我的回答:
Redis 有 5 种基本数据类型:
| 类型 | 典型应用场景 |
|---|---|
| String | 缓存、计数器(INCR)、分布式锁 |
| Hash | 存储对象(如用户信息) |
| List | 消息队列、最新 N 条记录 |
| Set | 标签、共同好友(交集/并集) |
| ZSet(Sorted Set) | 排行榜、延迟队列 |
💡底层实现:String 用 SDS,List 用 quicklist,ZSet 用跳表 + 哈希表。
六、项目介绍:突出技术栈与个人贡献
面试官提问:
“介绍一下你的项目。”
我的回答:
“我做了一个校园二手交易平台,主要功能包括商品发布、搜索、下单、聊天。
- 技术栈:Spring Boot + MyBatis + MySQL + Redis + WebSocket;
- 我的工作:
- 用 Redis 缓存热门商品,QPS 提升 3 倍;
- 基于 WebSocket 实现实时聊天;
- 用 JWT 实现登录鉴权;
- 通过
@Async异步发送通知,降低主链路延迟。
虽然项目不大,但让我完整体验了从前端交互到后端接口、从数据库设计到缓存优化的全流程。”
✅小厂建议:项目不求大,但要能讲清“你做了什么”和“为什么这么做”。
总结:小厂面试的核心逻辑
温州这家小厂的面试风格非常典型:
- 重基础:算法、集合、SQL 必考;
- 重原理:Spring、Redis 问到底层;
- 重实践:项目要能说出细节。
给读者的建议:
- 算法题必须手写:快排、链表、字符串是高频;
- 八股文要理解,不要死记:比如 Bean 生命周期,能画流程图最好;
- 项目哪怕简单,也要包装清楚:突出你的思考和技术选型理由。
最后:无论大厂小厂,扎实的基础 + 清晰的表达 = 实习 Offer!
从小厂起步,积累经验,未来冲击大厂更有底气!
📌觉得有帮助?欢迎点赞 + 收藏 + 关注!持续更新 Java 实习面经与学习路线!