个人情况
2017年毕业,普通本科,计算机科学与技术专业,毕业后在一个二三线小城市从事Java开发,2年Java开发经验。做过分布式开发,没有高并发的处理经验,平时做To G的项目居多。写下面经是希望给各位有相同面试公司的小伙伴做个参考,同时也希望记下自己的一些收获和踩下的坑。
简历投递
当时有考虑到深圳发展,所以在BOSS上标记意向工作城市为深圳。这家公司的BOSS主动找的我,问了我一些情况,问能不能到现场面试。我说如果可以,第一面最好电话面试,电话面试通过的话我是可以到现场面试的。他看了简历后,说明天晚上会有同事打电话给我,叫我注意接听,岗位:Java开发工程师。
一面
这是我毕业两年后的第一次面试,也是人生中第一次电话面试,毕业找工作,也就面了两次,所以还是有点小紧张。听声音,感觉电话另一头的小哥挺年轻,人很和善。好的,面试开始。所有面试的第一个流程,都是自我介绍,没的说,简单自我介绍完毕,他就问我之前在哪工作,是不是考虑到深圳发展。
接着就项目做了些简单的提问,项目并没有太多的东西,当时在的公司后端开发人员还是比较充裕的,所以平时任务量并不大,做的东西大部分都是根据需求完成一些功能模块,项目这块没什么好聊的,大概聊了五分钟左右。
技能考试开始:
你的项目中用过redis,你知道redis常用的数据结构有哪些么?答:String、List、Sort、Sorted set、Hash。
你知道redis为什么读写速度那么快么?答:因为它是基于内存存储,数据都装在内存里。
redis数据装在内存中,那么数据可以持久化吗?答:可以的,redis是支持数据持久化的。
redis数据持久化的方式有哪些呢?答:AOF和RDB。
这两种持久化方式的区别在哪里呢?答:RDB是以间隔时间去保存数据快照,一旦发生宕机,数据恢复速度较快,但是数据丢失可能会多一些。AOF是以追加指令的方式去保存操作指令,就像mysql中的binlog日志一样,一旦发生宕机,数据恢复速度会相对慢一些,但是数据丢失会少一些,可靠性相对高一些。
你知道redis的内存淘汰机制吗?答:不知道,那是什么东西呢?小哥告诉我说,redis的内存如果满了,如果这时候你再装入数据,这时候会对已经装在内存里的数据进行处理,后面你可以去了解下,我说好的(面试完后去了解了下-_-||)。
redis的cluster集群原理能简单说一下吗?答:redis的cluster集群是一种多主多从的集群方式,它将16384个槽平均分配到多个主节点中,数据读写时会 根据类似hash的算法找到对应的节点,主节点一旦宕掉,就会发生故障转移,从节点会补上代替主节点的位置。
redis的问题告一段落了。你们项目也是用的Spring,你知道什么是Spring的AOP吗?答:AOP是面向切面编程,通俗的说就是一种拦截的思想,它会在你执行方法的前后会执行相应的操作,比如全局日志记录和异常处理等。
你知道Spring的Scope吗?答:是不是默认加载到Spring容器中的对象是单例的那个东西。
既然是单例的,怎么能保证变量可能会随不同的人访问出现值的改变?答:每个线程都会有自己的私有内存。
你对多线程的知识有理解吗?答:知道一些。
了解过线程池吗?答:学习过。
你知道线程常用的线程有哪些吗?答:定长,可缓冲,单一还有单一定时。
那你知道他们的实现吗?答:都是同过ThreadPoolExecutor。
你知道实现线程池那几个参数的意义吗?答:核心线程数量,最大线程数量,线程空闲时间,有时间单位,还有一个队列。
那提交线程到线程池中执行任务的顺序你知道吗?答:线程数如果小于核心线程数时,创建线程;当线程数大于等于核心线程数,并且队列未满时,将任务放入队列中;如果当线程数大于等于核心线程数,且任务队列已满又分两种情况。核心线程数+新创建线程小于最大线程数时,会创建新线程去执行。如果核心线程数+新创建线程大于等于最大线程数时,会执行拒绝策略,默认的好像是抛出异常。
多线程的问题结束。到集合了。
平时常用的集合有哪些?答:ArrayList最多,还有HashMap以及HashSet。
你知道HashMap的原理吗?答:JDK1.8以前是数组加链表,1.8以后是数组+链表+红黑树。
在什么情况下会转为红黑树?答:链表上的元素大于等于8个时会转红黑树。
为什么它会引入红黑树呢?答:红黑树是一种数据结构,我觉得可能是用空间换时间,加快搜索把。
红黑树在什么情况下会变成链表呢?答:不知道。。(当红黑树中节点为6个情况下)。
好了,我这边没什么问题了?你有什么问题想问的吗?答:(当时不懂事,我上网看了些资料,说面试结果不能当场问。。)我不知道能不能过。。如果不能的话,其实你还可以多问些问题。。小哥笑了,我这边是没有什么问题,会让你通过的(唯一一个当场告诉我面试结果的,感谢!),我又问,能给我一些建议吗?他说我项目这块要好好多准备一下。我觉得这个小哥不错,以后可能会是同事,想问他名字,他害羞微笑的拒绝了,第一次电话面试就这样愉快的结束了,一面结果:通过。
二面
隔了一天,早上HR打电话给我,约我二面,约在了下周一现场面,地点:深圳音乐大厦。请了周一的假,星期天下午到的深圳。
周一早上提前十五分钟到了现场,这次面试怼我的有两个,其中一个我猜是组长,另一个应该是团队成员。
老套路,自我介绍,问项目,然后是相关技术面试,最后是还有什么要问的吗?这里重点说技术相关的问题。
简单聊了一会儿项目,没花多少分钟。开门见山,直接先怼spring。
你知道SpringIOC吗?答:它其实就一个容器,项目启动的时候,会把我们创建的类初始化创建对象后放入IOC容器中,我们需要使用对象时,直接取容器取就好了。(很口语化的说了个大概)
聊一聊SpringMVC的加载流程?答:(没有刻意去背。。所以只说了个原理。。)项目启动的时候,会扫描目录下我们自定义的controller方法,将url路径与执行的方法做个绑定。
SpringAOP是什么?答:跟一面回答的一样,一面有出现。
如果让你实现Mybatis,你会怎么设计?答:我会对dao层的接口进行拦截,获取要执行的sql语句,通过生成代理对象去执行sql,将获取的结果封装进通过反射生成的对象中。
Mybatis常用的标签有哪些?答:insert、delete、update、select、where、if、foreach等。
sql注入怎么预防?答:MyBatis中不要用美元就好($标签)。
为什么?#是采用预编译的方法,而$是拼接字符串。
sql一般怎么优化?答:从硬件方面考虑,配置性能越好对sql提升越有帮助,例如用固态硬盘等。
从软件方面,可以做的就是修改mysql的一些相关配置参数。
代码层面的话,就是一般如果出现慢查询,可以先定位慢查询,分析sql语句,并且适当建立索引,尽量避免使用导致索引失效的关键字,例如like等如果数据量过大的话可以考虑分库分表。
数据量多大的情况下考虑分表呢?答:这个我没实践过,不清楚,不过我看过阿里开发手册,单表数据量超过 500 万或者单表容量超过 2 GB的,可以考虑分表。
sql语句是怎么样执行的?答:不知道,不过我猜应该会先校验sql语句的正确性,然后再放入执行引擎中取执行。
你知道线程池吗?具体参数的作用是什么?答:同样的按一面来回答了。
给你一个场景,分别获取A、B、C、D盘子中水果的数量,最后再汇总统计,你会怎么做?答:用JUC里的CyclicBarrier。
给你一些文件,让你统计前N的关键字的数量?答:这个是topN问题,如果数据量小的话,我会直接写sql语句在数据库上跑;如果数据量大的话,我会考虑用hadoop或者spark。
让你实现秒杀功能,你会怎么做?答:简单说了下,秒杀功能的核心问题是高并发,考虑到mysql能承载的并发量不高,我会用redis做缓存,再将数据持久化到关系型数据库中。(还有一些细节,没想起来)
基本就这些了,然后问我有没有什么问题想问的?答:问了一些他们的项目类型,常用的技术栈,就没了。
二面结果:通过。让我等一下,其中一个面试官是去找他们技术总监去了。
三面
等了一下,技术总监出现,是个戴眼镜的挺斯文的一个中年人,大概35-40岁吧。问了下身边的面试官,技术怎么样?面试官说,挺不错的,技术这边都过一轮了。
三面总监基本没问技术问题,问了一下个人发展的规划,平时是怎么样学习的,怎么样安排自己的工作,学习和生活,你碰到过最难的问题是什么等等。
三面结果:通过。
三面结束,没有HR面。。面试完过了一个小时直接就发了一封邮件让我做个心理测评,title是高级开发工程师。第二天就打电话让我填一些材料,材料上写一些个人的信息,以及期望的薪水。隔天HR打电话来定薪,因为薪资问题,我拒绝了OFFER。
面试感受:面试效率高,流程短,问的问题大部分很实在,基本都是需要掌握的。面试官很友好,并没有刁难人,就是薪水没谈拢,很可惜。如果有收到面试邀请的朋友,可以去试试。
以上为个人面试经过及当时口述答案,仅供大家参考,进行查缺补漏。
原文:https://www.cnblogs.com/maguanyue/p/11605910.html