news 2026/6/15 22:05:36

27届温州小厂Java后端实习一面复盘:快排、大数相加、链表判环 + Spring核心原理全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
27届温州小厂Java后端实习一面复盘:快排、大数相加、链表判环 + Spring核心原理全解析

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 实习面经与学习路线!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 11:01:09

新手也能写高性能代码:从入门到实践

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个面向初学者的高性能代码学习平台&#xff0c;提供从基础到进阶的教程和练习。平台应包含简单的性能优化示例&#xff08;如循环优化、缓存利用等&#xff09;&#xff0c;…

作者头像 李华
网站建设 2026/6/15 8:53:14

ES教程项目应用:油井远程监控

油井远程监控实战&#xff1a;用 Elasticsearch 打造工业级数据中枢在内蒙古的荒原上&#xff0c;一口油井正悄然发生异常——压力传感器读数连续攀升&#xff0c;但值班人员还在百公里外的调度中心翻阅纸质报表。这样的场景在过去屡见不鲜。而今天&#xff0c;同样的预警信息会…

作者头像 李华
网站建设 2026/6/15 11:27:50

SGMICRO圣邦微 SGM37892AYUDT6G/TR DFN6 LED驱动

特性要点 输入电源电压范围:2.7V至5.5V最大闪光灯驱动电流: 720mA(SGM37892) 1240mA(SGM37892A)闪光超时保护时间:650ms(典型值)闪光灯超时保护计时器可灵活复位&#xff0c;更好支持连拍应用6级调光(SGM37892),8级调光(SGM37892A)闪光灯模式与手电筒模式驱动电流之比约为4:1 *…

作者头像 李华
网站建设 2026/6/15 8:53:54

在线教育题库生成质量控制:Qwen3Guard-Gen-8B保驾护航

在线教育题库生成质量控制&#xff1a;Qwen3Guard-Gen-8B保驾护航 在K12在线教育平台的教研后台&#xff0c;一个看似普通的命题请求正悄然触发整套AI系统&#xff1a; “请根据鲁迅《故乡》节选段落&#xff0c;生成一道适合初中三年级学生的主旨理解题。” 几秒后&#xff…

作者头像 李华
网站建设 2026/6/15 8:57:35

画图像写代码一样快?告别 Visio,Mermaid 保姆级上手指南

前言&#xff1a;为什么你应该放弃拖拽式画图&#xff1f; 作为一名程序员或产品经理&#xff0c;画图几乎是日常工作的刚需。无论是理清业务逻辑的流程图&#xff0c;还是系统交互的时序图&#xff0c;甚至是项目排期的甘特图。 但你是否遇到过这些崩溃瞬间&#xff1a; 排…

作者头像 李华
网站建设 2026/6/15 8:51:35

2026 工作计划 PPT 怎么做更专业?7 款 AI 工具推荐,模板+内容双加速

在忙碌的职场中&#xff0c;每到年末年初&#xff0c;制作工作计划 PPT 就成了众多职场人的“噩梦”。熬夜改报告是常有的事&#xff0c;好不容易搭好的框架&#xff0c;却总感觉内容不够专业、逻辑不够清晰。而且&#xff0c;设计方面也缺乏灵感&#xff0c;不知道怎么配色、排…

作者头像 李华