我的面试复盘总结(亚信科技)
2年经验面初级开发这次面试下来我整体感觉还是比较稳的。面试官问的问题覆盖了Java基础、集合框架、项目经验、数据库、缓存、异常处理、AI工具使用等几个维度我基本都能答得上来而且大部分问题回答得还算准确和深入。做得比较好的地方基础方面ArrayList和LinkedList的区别、扩容机制、HashMap的put流程这些八股文题目我回答得比较完整时间复杂度、扩容倍数、树化条件这些关键点都说到了面试官没有追问就过了。项目经验方面面试官对我做的PDF生成模块问得比较细从生成逻辑到文件存储到MinIO再到生产环境使用情况我都如实说了。虽然这个模块体量不大、并发不高但确实是我自己做过的、已经上生产的真实功能所以回答的时候底气是足的。Redis那块我说了用Hash存Token、用String存短信验证码超时处理用拦截器校验滑动窗口续期的设计思路也说了面试官看起来是认可的。值得一提的是我的个人项目就是我为了恢复工作状态自己弄的那个优惠券小程序。从需求来源自己翻真实需求、需求分析用了工具辅助、开发到部署内网穿透、手机随时访问这一套全流程我都是自己实操的。面试官听到这里明显比较感兴趣我觉得这是加分项因为能体现出我的自驱力和工程化能力。AI工具使用方面我确实在用Cursor和Trae而且不是无脑用我会review AI生成的代码也发现过空指针之类的bug还让Cursor帮我改过前后端bug。面试官应该能感觉到我是把AI当工具用而不是依赖它。暴露出来的薄弱点有两个问题我答得不太好。第一个是统一返回体的封装位置我当时说“好像不是在那两个地方”虽然方向没错但表述不够清晰和自信。其实就应该直接说在common模块定义一个Result泛型类配合全局异常处理器使用Controller层统一返回Result。第二个是MySQL调优当面试官问到底层SQL优化时我只说了建立索引和分库分表后面就接不下去了。这块确实是我的短板没有真实处理过大数据量场景的调优经验。不过对于初级岗位这个深度其实也还能接受。还有就是AI模板化提问那个问题我之前确实没意识到需要做这个面试官提出来之后我当场就“懂了”这个学习态度应该是给面试官留下了好印象。整体评价我觉得这次面试基本能过。基础题全拿住了项目经验真实可讲个人项目证明了我不是只会干活、还有自主学习和折腾的劲头。虽然在调优和分层设计上有些薄弱但对于初级/初中级岗位来说面试官大概率不会因为这个卡我。我的思维能力、技术基础都没问题项目上该有的我都有哪怕让我设计我也能给出方案——只不过有些场景确实没实操过但初级岗位不要求这个深度。接下来如果有二面或者HR面我会更有底气。以下是问答记录1、说一下 arraylist 和 linkedlist 它的区别我们平常使用的过程中去怎么去选arraylist第一个从他们的查找和增删来看Arraylist 由于底层是动态数组。所以它查找的时间复杂度是 o1但是它的中间的增删由于涉及到后续的后续元素的移动因此它增删的复杂度能达到 on。在他的尾部进行增删的时间复杂度也是 o1linkedlist 由于它的底层是一个双向链表。维护了一个头尾指针因此首先在头尾的中差很快中间增删由于是一个链表需要进行定位因此很慢。从他们的存储这里来看arraylist它在它的尾部通常会预留一定的空间然后 linkedlist 的不会它是会在新增节点的时候分配空间。从它的使用场景来看Arraylist 主要适合那种读多写少的场景然后 linkedlist主要适合那种在头尾增删频繁的场景。我们绝大多数情况下使用的都是 arraylist。2、arraylist如果要扩容的话一般是扩多少初始容量是10然后扩容的时候会变为原来的1.5倍。它会将原来数组的元素全部都复制到新位置。3、介绍一下哈希 map 它的一个 put 流程。首先根据元素值计算出它的一个哈希值定位它在桶中的位置查看是否有哈希冲突。如果有哈希冲突的话先判断先没有哈希冲突就用那个是就直接放进去如果有哈希冲突。就通过链表的尾插法也插进去发现 链表 的长度大于等于八并且当前的容量是大于等于64的它还会进行一个树化。4、在项目中的一个全局的异常处理是怎么做的类声明上如果我们要创建的异常类是必检异常比如说 io 异常类似的那么我们就写一个继承自 exception 类的子类重写它的一个构造方法如果是。非检异常比如说这种空指针异常类似的我们就写一个继承自runtime exception 类的一个子类。还要写一个全局的异常处理器去捕获非必检异常然后给它封装一些前端能够识别的友好提示。5、你们封装返回的话是有个统一封装在 service 还是在 controller题目理解错了以为问的自定义异常的统一返回哪里封装感觉统一返回的话好像都不是在这两者了。自定义了一个全局使用的类throw一个 new一个return exception这是定义的类然后创建的一个对象异常对象。好像不是在那两个地方。6、你说的 pdf 的布局组件是什么东西主要是基于我之前工作中实际的 pdf 生成功能做了大量的优化和重构当时为了生成。证书这种单页的 pdf这种 pdf 有个特点它的头部和底部是高度固定的然后中间有一些可变列表行数和内容都不确定。7、就是一个生成 pdf 文件的系统然后是后端的话就是动态去输入内容你这边负责的话渲染做了一些增强我复盘之后增强的。我让后端传的是一个对象进来。所有数据是他那边获取。8、持久层的库是什么比如说你生成的 pdf 里面的内容有在哪存储的我们当时按照项目来看这样的把 pdf 文件生成一个文件流然后它上传到我们的文件中心的根据文件的编号。是存在我们MinIO里面的。9、只存了文件没有存文本吗数据量大不大文本就没储存了数据库里也存了文件的相关信息。基本信息嘛这是数据库层面的基本信息。因为不同的业务来获取的数据不一样。下单到证书生成可能一天生成几个到十几个不等主要是因为我们。客户首先他的首先单价很高因此客户数量比较少。所以就。并发量什么的也基本上没有什么并发量。10、有上生产吗是否上线使用体量很少是吧已经用在生长环境客户下单之后已经使用了到最近为止有好几年。体量较少。11、你们文件服务器有没有比如说满了什么的。对文件或历史数据有没有不使用的清理。这种场景目前还没有。对没有好像是用了三台还是两台机器来存的。12、项目有多少开发人员后端多少人项目开发人数最多的有30来人吧这一个项目因为它分了很多块。有小程序有管理后台还有主要还有一个 mes系统那一块是特别大。 前端有一个组有7个人后端有20来人。13、你刚说的有小程序你这边有也有设计你给我讲一下小程序这个项目。90也是我们项目中也有我自己也弄了一个首先项目的需求来源 我是自己去找的那种某个平台里面去翻的翻到真实需求然后去做了一些需求分析由于需求分析这一块我不是特别擅长的我是借助了工具的帮他帮我分析的需求根据这需求分析的内容我做了一些出来它主要是解决那种线下门店用纸质券他记账什么的折价什么的都不太方便。就这样用一个那种后台的领券管理再到客户领券再到优惠券核销全流程的管理体系我就把它弄出来了项目。14、你自己去做的不是公司的项目小程序的后管理端的那些配置什么的这一套流程你都自己去实操真实去能访问吗不是公司主要是为了恢复我的工作状态练了之后确实也有很好的效果。我现在已经部署内网穿透了我现在可以在手机上随时都能访问它它的后台和管理系统后台还有个小程序。都全反正全流程都是弄通了的部署也是一开始开发阶段之前已经部署好了什么数据库 Redis。这些。15、你项目中用到的数据库一般都是啥Mybatis防SQL注入的话一般是用什么关键字符Mysql,用井号加大括号它就相当于是 sql 的一个参数占位符。然后 mybatis 会在运行之前先替换成问号去调用 prepare statement 里面的一个设置参数的方法。当然顺序的把参数给放进去这样的话他就不会把你输入的字符串当成 sql 的一部分只是当成一个参数。16、Mybatis分页怎么使用首先需要创建一个 mybatis 的拦截器然后在里面主要的目的是为了调用修改设置数据库类型的方法。然后使用的时候先创建一个page对象再用 select page方法。当然这个方法你也可以传入一个 lamba query rapper。因为它支持 lamba 表达式然后 eq 还有 like 这些方法都可以检查你的字段名什么的你调试起来非常方便。17、 你们项目中有没有对数据库 mysql 数据库的一个调优部分你自己有没有接触过我不知道把它的容器化那种算不算就是我写了一个 mysql 的 dockerfile然后当时我我组长叫我写了写了之后利用它部署到我们 k8s 集群里面去了。里面有东西它那个数据卷挂载这些东西这些我当时没考虑到也是我组长教的。18、这是架构方面的有没有对底层的 SQL 这方面的优化比如说数据体量过大的话。怎么去保证它的一个增删改查这种效率分库分表只知道这个东西目前大我可能标准做法大概这样的第一种是就是对那种查询比较频繁的可以考虑建立一下索引。第二种我大致了解是一个可以分库分表可以分到不同的数据库里面然后。但是。大致的我想他。大致的我确实也还没了解到那一步。19、我看你里面也有用的 redisRedis 的话一般你项目中 redis 用来做什么或者用了哪些数据类型项目中主要是用的他 redisredis 的一个哈希主要是用来存我们的 token。Token 来存用户的登录信息用的。还有一个存我们的短信验证码就这两块当然我们 Token 存的它 key 是用的一个 jwt。管理存在是用户的详情信息用来快速获取用户信息用的。20、你存登录信息超时那一块怎么去处理的首先拦截器去获取拦截到 jwt然后把 jwt 去 redis 里查一下这个 key 是否能找到如果我在查不到直接这时候就返回给他用户。登录已失效。前端层面就是直接跳转到登录页面当然我们设置这个 key 的时候肯定设置了过期时间我们那过期时间当时是设置的是10个小时你就能维持到我们整个开发。你早上登录到晚上下班的时间。21、即将过期的时候操作是否会强制退出你提到了滑动窗口过期让你来怎么设计我每次登录的时候就去每次不对每次使用每次。你让我使用到 jwt你或许你看一下它的过期时间如果发现他可能在将要过期。比如说他 ttl 啥的可能那么只剩1分钟我不确定 redis 能否看到 ttl如果说低于1分钟那么。这时候我不知道可不可以去改过期时间我只能说是把数据库的重新自己再重新查一遍再设置一遍进去但查库操作也只仅仅只在即将过期的时间段内。这样的话他下次来的时候就也是一样的操作。22、今年 ai 用的也挺多你们实际中有没有去对 ai 的这一块使用我们当时那个团队是毕竟是在2023或者2024也接触过 ai那个时候主要是对它做来提问或者说弄文件啥的我最近我自己也去使用了一下比如说我跟你说那个小程序的所有的前端还有它的后台系统的所有前端的我全是用 ai 帮我弄的只是我在中途的。是负责跟他联调的中途也解决了很多开发的遇到的问题当然他自己我也发现了有些时候 确实也会产生各种各 bug比如说最经典的我有一个优惠券的。显示嘛明明我有些字段有个字段表示了我这里是一个折扣券让它显示几折的结果他直接给我显示的显示成金额了显示成金额0.7。本来我是想要再显示7折的嘛有一个 cursor 还是挺厉害的我之前叫他给我改后端 bug 改前端 bug他甚至顺手帮我把后端的一个小 bug 给修了。23、目前用到的工具就是刚说的。cursor还有其他的吗你用是怎么个形式用是插件命令其他方式才用过那个字节的那个trea那个用它主要是因为它免费嘛一开始有几天用的还是挺好的。我直接下载了他官方软件打开那个项目。也就是一个跟他们自己的一个 ide 开发工具。24、你用 ai 生成过代码吗一般都是生成什么什么类型代码那种它的功能较为重复的比较简单那种只有 cud 的功能那些功能模块比如说那生成一些那种固定的实体类啥的。我告诉他数据库的字段是什么为了让他写一下增删改查我写过一个模块核销的模块。当然也发现了 反正用起来就发现它有时候会犯一些很小的问题比如最经典的一个空指针那里它不判空就它从 redis 里获取信息之后直接使用返回的对象开始操作它也没有判空什么的。25、你自己有没有总结过一些一些模板比如说你给他喂的信息喂什么格式的什么什么模板信息来要求他(确实没弄过)确实倒是没使用到那一步原来还需要懂了原来还有还需要有这样一种操作可以去约束一下他懂了。以后注意一下。