2019-12-10和2019-12-13面试点记录

面试点记录

临近年终,大量公司、企业进入一年中最后的招人高峰期,作为一个刚毕业进入社会的萌新,抱着即使面试失败也可以知道自己有几斤几两,哪个方面存在不足的心态在招聘网上投递了简历。

2019-12-10

这一天我收到了两个面试邀请,其中一个是电话面,一个是现场面:

  1. 现场面

先是做了一套笔试题,要求40分钟完成,总共三道题目,第一道是数据库E-R图设计;第二道是sql查询;第三道是算法题,要求必须用代码实现,不能使用伪代码。
笔试完成进入面试,面试官经验很丰富,问了很多问题,有简单的也有较难的。这里就简单记录下我没有回答上,或者回答的不好的问题:

  • sql注入是如何产生的及解决方式? mybatis是如何避免sql注入的,实现原理?(这里面试官跟我说mysql自身实现了避免sql注入的机制,我之前没了解过不知道是不是这样的)
  • Controller层返回二进制文件给前端如何实现?(听到这个问题我突然懵了,这个在一开始学框架的时候学过,后面项目开发一直没怎么使用,所以脑子短路没回答上来,有很多种实现方式,最简单的其实就是通过输出流)
  • Controller如何返回json格式数据?(这个也是突然懵逼了,天天都在用,却突然说不出来,不过还好回忆起来了,SpringMVC是使用@ResponseBody注解来支持返回json格式数据的,后面面试官又补充问了不借助注解如何实现?不出所料,我又懵逼了,没答上,后面查了下资料,有几种实现形式,一种就是使用HttpServletResponse设置response的ContentType为application/json就好了,还有就是使用MappingJackson2CborHttpMessageConverter,其实原理差不多,注解也只是帮我们封装了操作而已)
  • Controller如何接收json格式的数据?以及如何不借助注解实现接收json数据?json格式数据与formdata格式的数据是存放在请求的哪个地方?
    (使用@RequestBody注解接收json数据,不借助注解实现的话就需要自己去request中读取数据转换出来,json格式的数据放在request payload中,formdata格式的数据放在 form data中)
  • 说下spring的事务传递?
    (这块内容我之前了解的比较少,只是知道有这个东西,但是具体是什么就说不上来,后面查了资料了解了一下,spring支持7种事务传递机制,分别为:
  1. REQUIRED(默认):支持使用当前事务,如果当前事务不存在,创建一个新事务。
  2. SUPPORTS:支持使用当前事务,如果当前事务不存在,则不使用事务。
  3. MANDATORY:中文翻译为强制,支持使用当前事务,如果当前事务不存在,则抛出Exception。
  4. REQUIRES_NEW:创建一个新事务,如果当前事务存在,把当前事务挂起。
  5. NOT_SUPPORTED:无事务执行,如果当前事务存在,把当前事务挂起。
  6. NEVER:无事务执行,如果当前有事务则抛出Exception。
  7. NESTED:嵌套事务,如果当前事务存在,那么在嵌套的事务中执行。如果当前事务不存在,则表现跟REQUIRED一样。详细的内容还有很多,想了解的可以单独去查下资料)
  • 事务等级及每个等级的区别?
    (这块刚好前端时间看了mysql的事务隔离级别,但是却没有很好地组织好语言,表述的不是很好,所以这里做下记录:
事务隔离级别 脏读 不可重复读 幻读
读未提交(Read Uncommitted)
不可重复读(Read Committed)
可重复读(Repeatable Read)
串行化(Serializable)

顺带提一句:mysql默认的事务隔离级别为Repeatable Read)。

  • springboot底层是如何实现的?(这个问题我觉得问的有点奇怪,如果问某一个功能倒还说的过去,不过springboot底层就是采用注解形式,基于SpringMVC无配置文件完全注解化,内置容器使用main函数启动)
  • 如何保证redis数据与数据库数据的一致性?(一开始没有很好地回答出来,后面想到了采用消息中间件的形式实现,这样即使同步数据过程出现了问题也可以通过消息中间件的机制进行补偿,但是我提出如果在消费者端使用了异步逻辑并且异步逻辑失败的话消息中间件是感知不到的来反问面试官,面试官没有回答,只是说不会在消费者端使用异步逻辑来回避了我的提问)
  1. 电话面
    面试的惯例,从自我介绍开始,然后就直接开始了技术提问,这个面试官是个大牛,比较看重算法,问了很多问题,我都没有回答的特别好,应该是凉了。。。不过还是记录一下:
  • 了解哪些常用排序算法?每种排序算法的时间复杂度?(算法一直是我的软肋,再加上没有准备,所以回答的非常糟糕。
稳定的排序 时间复杂度 空间复杂度
冒泡排序(bubble sort) 最差、平均都是O(n^2),最好是O(n) 1
插入排序(insertion sort) 最差、平均都是O(n^2),最好是O(n) 1
归并排序(merge sort) 最差、平均、最好都是O(n log n) O(n)
桶排序(bucket sort) O(n) O(k)
基数排序(Radix sort) O(nk)(k是常数) O(n)
二叉树排序(Binary tree sort) O(n log n) O(n)
不稳定的排序 时间复杂度 空间复杂度
选择排序(selection sort) 最差、平均都是O(n^2) 1
希尔排序(shell sort) O(n log n) 1
堆排序(heapsort) 最差、平均、最好都是O(n log n) 1
快速排序(quicksort) 平均是O(n log n),最差是O(n^2) O(log n)

  • 给定一个整型有序数组及一个整数,求出这个数组中任意两个数相加等于这个整数的所有可能结果并输出?(不用说了,没答上,默默地回去学算法了,实现方法可以从网上找下,这里不介绍了)
  • 说下golang中的Context上下文?(刚开始学go,还没学到这块,直接说不知道。。。)
  • 网络原理中的内容,让我描述下对两个词的理解,说是Socket中用到的?(由于压根没听清说的单词是啥,就过了。。。但是网络相关知识还是需要复习一下的)
  • springboot的底层实现,有没有看过源码?(又是这个,没答上来,因为确实没怎么看过源码,同志仍需努力啊)
  • 事务隔离级别?(没错,又是它,赶紧回去恶补)
  • redis底层存储结构?(刚开始听到有点懵,因为已经被问懵了。。。还以为问的是redis这么快,底层数据结构是如何实现的呢,其实问的是redis的几种数据存储结构。redis数据结构有:
    字符串类型(String)、散列类型(Hash)、列表类型(List)、集合类型(Set)、有序集合类型(SortedSet)、发布订阅(pub/sub)、事务(Transaction),每种类型都有它各自的用法及对应的使用场景)
  • redis过期策略?(设置过期时间,3种过期策略:
  1. 定时删除(在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除)
  2. 惰性删除(key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null)
  3. 定期删除(每隔一段时间执行一次删除(在redis.conf配置文件设置hz,1s刷新的频率)过期key操作)

redis采用的是惰性删除+定期删除策略

  • springboot框架是如何实现io操作的?(没听过这种问题,IO操作不是java自身实现的吗?框架只是做了个封装而已)

2019-12-13

这天的面试是去现场面的,先是进行笔试,笔试题总共8道题,要求40分钟完成,基础题5道,算法题3道,基础题包括:

  1. 对Linux的理解
  2. sql调优
  3. 从网络角度分析解决用户访问网站慢的问题
    还有几道想不起来了;

算法题分别是:

  1. 找出整型数组中的最小值,数组经过了循环右移操作;
  2. 将二叉树转换成双向链表;
  3. 设计一个方案实现支持处理千万级别任务,秒级精度响应的定时任务。

面试问的技术点不多,猜测是我的笔试成绩不佳,所以就没打算进一步了解了吧,就问的比较敷衍,主要就问了 GO 的 slice 还有 channel 相关的内容,还问了一个算法题:
一个10G的文件,里面有很多行字符,每行字符长度不一致,有些很长,有些很短,要求将每行的字符限制在4096个字节内存储?字符类型一开始没有限制,后面给出了限制,都是字母,要实现这样一个压缩内容的算法,怎么实现?(没有想出解决方案。。。)

这次的面试表现比较差,笔试没发挥好是一个问题,算法基础薄弱是最大的问题,在此记录下吧,路漫漫其修远兮啊,通过这几次面试,明白了自己的定位,还有很多不足,还有很多需要学习的东西,头发不够用了啊。

发布了42 篇原创文章 · 获赞 10 · 访问量 7046

猜你喜欢

转载自blog.csdn.net/MCJPAO/article/details/103532404
今日推荐