河南省网站建设_网站建设公司_UX设计_seo优化
2026/1/7 10:13:40 网站建设 项目流程

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 有什么区别?”

我的回答:

维度ArrayListLinkedList
底层结构动态数组双向链表
随机访问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 生命周期(简化版):

  1. 实例化:调用构造器或工厂方法;
  2. 属性赋值:通过 setter 或字段注入依赖;
  3. Aware 接口回调:如BeanNameAwareApplicationContextAware
  4. BeanPostProcessor 前置处理postProcessBeforeInitialization
  5. 初始化方法@PostConstructinit-method
  6. BeanPostProcessor 后置处理postProcessAfterInitialization
  7. 就绪使用
  8. 销毁:容器关闭时调用@PreDestroydestroy-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 问到底层;
  • 重实践:项目要能说出细节。

给读者的建议:

  1. 算法题必须手写:快排、链表、字符串是高频;
  2. 八股文要理解,不要死记:比如 Bean 生命周期,能画流程图最好;
  3. 项目哪怕简单,也要包装清楚:突出你的思考和技术选型理由。

最后:无论大厂小厂,扎实的基础 + 清晰的表达 = 实习 Offer!
从小厂起步,积累经验,未来冲击大厂更有底气!

📌觉得有帮助?欢迎点赞 + 收藏 + 关注!持续更新 Java 实习面经与学习路线!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询